/ Hex Artifact Content
Login

Artifact 0c5fa756d8f8d0a911798fe9a055d48288837054:


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 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 3a 0a 2a 2a 20 20 20 20 20 20 2b 20  ions:.**      + 
0540: 66 6f 72 20 50 6f 73 69 78 20 41 64 76 69 73 6f  for Posix Adviso
0550: 72 79 20 4c 6f 63 6b 73 0a 2a 2a 20 20 20 20 20  ry Locks.**     
0560: 20 2b 20 66 6f 72 20 6e 6f 2d 6f 70 20 6c 6f 63   + for no-op loc
0570: 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72  ks.**      + for
0580: 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 73 0a   dot-file locks.
0590: 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 66 6c  **      + for fl
05a0: 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ock() locking.**
05b0: 20 20 20 20 20 20 2b 20 66 6f 72 20 6e 61 6d 65        + for name
05c0: 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
05d0: 73 20 28 56 78 57 6f 72 6b 73 20 6f 6e 6c 79 29  s (VxWorks only)
05e0: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 41  .**      + for A
05f0: 46 50 20 66 69 6c 65 73 79 73 74 65 6d 20 6c 6f  FP filesystem lo
0600: 63 6b 73 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  cks (MacOSX only
0610: 29 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20  ).**      + for 
0620: 70 72 6f 78 79 20 6c 6f 63 6b 73 20 28 4d 61 63  proxy locks (Mac
0630: 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 2a  OSX only).**   *
0640: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d    sqlite3_file m
0650: 65 74 68 6f 64 73 20 6e 6f 74 20 61 73 73 6f 63  ethods not assoc
0660: 69 61 74 65 64 20 77 69 74 68 20 6c 6f 63 6b 69  iated with locki
0670: 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69  ng..**   *  Defi
0680: 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
0690: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
06a0: 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 6c 6f  jects for all lo
06b0: 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
06c0: 74 68 6f 64 73 20 70 6c 75 73 20 22 66 69 6e 64  thods plus "find
06d0: 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  er" functions fo
06e0: 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e 67 20 6d  r each locking m
06f0: 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  ethod..**   *  s
0700: 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
0710: 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  d implementation
0720: 73 2e 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e  s..**   *  Defin
0730: 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
0740: 33 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f  3_vfs objects fo
0750: 72 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65  r all locking me
0760: 74 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c  thods.**      pl
0770: 75 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  us implementatio
0780: 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73  ns of sqlite3_os
0790: 5f 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69  _init() and sqli
07a0: 74 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a  te3_os_end()..**
07b0: 0a 2a 2a 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78  .** $Id: os_unix
07c0: 2e 63 2c 76 20 31 2e 32 32 35 20 32 30 30 38 2f  .c,v 1.225 2008/
07d0: 31 32 2f 30 33 20 31 39 3a 33 34 3a 34 37 20 64  12/03 19:34:47 d
07e0: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
07f0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0800: 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  h".#if SQLITE_OS
0810: 5f 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20  _UNIX           
0820: 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20     /* This file 
0830: 69 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20  is used on unix 
0840: 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  only */../*.** T
0850: 68 65 72 65 20 61 72 65 20 76 61 72 69 6f 75 73  here are various
0860: 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c   methods for fil
0870: 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66  e locking used f
0880: 6f 72 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a  or concurrency.*
0890: 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a  * control:.**.**
08a0: 20 20 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b     1. POSIX lock
08b0: 69 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74  ing (the default
08c0: 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f  ),.**   2. No lo
08d0: 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44  cking,.**   3. D
08e0: 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  ot-file locking,
08f0: 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29  .**   4. flock()
0900: 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35   locking,.**   5
0910: 2e 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f  . AFP locking (O
0920: 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36  SX only),.**   6
0930: 2e 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  . Named POSIX se
0940: 6d 61 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b  maphores (VXWork
0950: 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e  s only),.**   7.
0960: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20   proxy locking. 
0970: 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a  (OSX only).**.**
0980: 20 53 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e   Styles 4, 5, an
0990: 64 20 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61  d 7 are only ava
09a0: 69 6c 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45  ilable of SQLITE
09b0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
09c0: 53 54 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69  STYLE.** is defi
09d0: 6e 65 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53  ned to 1.  The S
09e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
09f0: 4b 49 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20  KING_STYLE also 
0a00: 65 6e 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  enables automati
0a10: 63 0a 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f  c.** selection o
0a20: 66 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  f the appropriat
0a30: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  e locking style 
0a40: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c  based on the fil
0a50: 65 73 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65  esystem.** where
0a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0a70: 20 6c 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23   located.  .*/.#
0a80: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
0a90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0aa0: 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64  G_STYLE).#  if d
0ab0: 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
0ac0: 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  _).#    define S
0ad0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0ae0: 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20  KING_STYLE 1.#  
0af0: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
0b00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0b10: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23  OCKING_STYLE 0.#
0b20: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0b30: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65  /*.** Define the
0b40: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d   OS_VXWORKS pre-
0b50: 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20  processor macro 
0b60: 74 6f 20 31 20 69 66 20 62 75 69 6c 64 69 6e 67  to 1 if building
0b70: 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c   on .** vxworks,
0b80: 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
0b90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56  .*/.#ifndef OS_V
0ba0: 58 57 4f 52 4b 53 0a 23 20 20 69 66 20 64 65 66  XWORKS.#  if def
0bb0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c  ined(__RTP__) ||
0bc0: 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45   defined(_WRS_KE
0bd0: 52 4e 45 4c 29 0a 23 20 20 20 20 64 65 66 69 6e  RNEL).#    defin
0be0: 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23  e OS_VXWORKS 1.#
0bf0: 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
0c00: 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a  ne OS_VXWORKS 0.
0c10: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
0c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65  ./*.** These #de
0c30: 66 69 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61  fines should ena
0c40: 62 6c 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75  ble >2GB file su
0c50: 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69  pport on Posix i
0c60: 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79  f the.** underly
0c70: 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
0c80: 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74  stem supports it
0c90: 2e 20 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63  .  If the OS lac
0ca0: 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65  ks.** large file
0cb0: 20 73 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20   support, these 
0cc0: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73  should be no-ops
0cd0: 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69  ..**.** Large fi
0ce0: 6c 65 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62  le support can b
0cf0: 65 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67  e disabled using
0d00: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49   the -DSQLITE_DI
0d10: 53 41 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68  SABLE_LFS switch
0d20: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  .** on the compi
0d30: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
0d40: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
0d50: 73 61 72 79 20 69 66 20 79 6f 75 20 61 72 65 20  sary if you are 
0d60: 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20  compiling.** on 
0d70: 61 20 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65  a recent machine
0d80: 20 28 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32   (ex: RedHat 7.2
0d90: 29 20 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79  ) but you want y
0da0: 6f 75 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b  our code to work
0db0: 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20  .** on an older 
0dc0: 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64  machine (ex: Red
0dd0: 48 61 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f  Hat 6.0).  If yo
0de0: 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64  u compile on Red
0df0: 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f  Hat 7.2.** witho
0e00: 75 74 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  ut this option, 
0e10: 4c 46 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20  LFS is enable.  
0e20: 42 75 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74  But LFS does not
0e30: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65   exist in the ke
0e40: 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61  rnel.** in RedHa
0e50: 74 20 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f  t 6.0, so the co
0e60: 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20  de won't work.  
0e70: 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d  Hence, for maxim
0e80: 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72  um binary.** por
0e90: 74 61 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f  tability you sho
0ea0: 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a  uld omit LFS..**
0eb0: 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73  .** The previous
0ec0: 20 70 61 72 61 67 72 61 70 68 20 77 61 73 20 77   paragraph was w
0ed0: 72 69 74 74 65 6e 20 69 6e 20 32 30 30 35 2e 20  ritten in 2005. 
0ee0: 20 28 54 68 69 73 20 70 61 72 61 67 72 61 70 68   (This paragraph
0ef0: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f   is written.** o
0f00: 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e 29 20 54  n 2008-11-28.) T
0f10: 68 65 73 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c  hese days, all L
0f20: 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 73 75 70  inux kernels sup
0f30: 70 6f 72 74 20 6c 61 72 67 65 20 66 69 6c 65 73  port large files
0f40: 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75  , so.** you shou
0f50: 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c 65 61 76  ld probably leav
0f60: 65 20 4c 46 53 20 65 6e 61 62 6c 65 64 2e 20 20  e LFS enabled.  
0f70: 42 75 74 20 73 6f 6d 65 20 65 6d 62 65 64 64 65  But some embedde
0f80: 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68  d platforms migh
0f90: 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e  t.** lack LFS in
0fa0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
0fb0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
0fc0: 46 53 20 6d 61 63 72 6f 20 6d 69 67 68 74 20 73  FS macro might s
0fd0: 74 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a  till be useful..
0fe0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0ff0: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
1000: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49  define _LARGE_FI
1010: 4c 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e  LE       1.# ifn
1020: 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  def _FILE_OFFSET
1030: 5f 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65  _BITS.#   define
1040: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
1050: 54 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20  TS 64.# endif.# 
1060: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c  define _LARGEFIL
1070: 45 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69  E_SOURCE 1.#endi
1080: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
1090: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
10a0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
10b0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
10c0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
10d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
10e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
10f0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
1100: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
1110: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
1120: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
1130: 68 3e 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  h>..#if SQLITE_E
1140: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1150: 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  YLE.# include <s
1160: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 66  ys/ioctl.h>.# if
1170: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69   OS_VXWORKS.#  i
1180: 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72  nclude <semaphor
1190: 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20  e.h>.#  include 
11a0: 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73  <limits.h>.# els
11b0: 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  e.#  include <sy
11c0: 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20 69 6e 63  s/file.h>.#  inc
11d0: 6c 75 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e  lude <sys/param.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 20 65 6e  ys/mount.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
1230: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
1240: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
1250: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
1260: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
1270: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
1280: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1290: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
12a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
12b0: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
12c0: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
12d0: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
12e0: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
12f0: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1300: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1310: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
1320: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
1330: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1340: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
1350: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
1360: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1370: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
1380: 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65 66 61 75  if../*. ** Defau
1390: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
13a0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74  hen creating aut
13b0: 6f 20 70 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a  o proxy dir. */.
13c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
13d0: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
13e0: 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65  PERMISSIONS.# de
13f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41  fine SQLITE_DEFA
1400: 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
1410: 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65  MISSIONS 0755.#e
1420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
1430: 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
1440: 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64  th-length..*/.#d
1450: 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41  efine MAX_PATHNA
1460: 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  ME 512../*.** On
1470: 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45  ly set the lastE
1480: 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f  rrno if the erro
1490: 72 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c  r code is a real
14a0: 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a   error and not .
14b0: 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65  ** a normal expe
14c0: 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65  cted return code
14d0: 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   of SQLITE_BUSY 
14e0: 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a  or SQLITE_OK.*/.
14f0: 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f  #define IS_LOCK_
1500: 45 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d  ERROR(x)  ((x !=
1510: 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28   SQLITE_OK) && (
1520: 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  x != SQLITE_BUSY
1530: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75  )).../*.** The u
1540: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
1550: 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66  e is subclass of
1560: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70   sqlite3_file sp
1570: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e  ecific to the un
1580: 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d  ix.** VFS implem
1590: 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79  entations..*/.ty
15a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
15b0: 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a  xFile unixFile;.
15c0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
15d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  {.  sqlite3_io_m
15e0: 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d  ethods const *pM
15f0: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
1600: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
1610: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  y */.  struct un
1620: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
1630: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20  ;       /* Info 
1640: 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66  about all open f
1650: 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  d's on this inod
1660: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
1670: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
1680: 6b 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20  k;      /* Info 
1690: 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74  about locks on t
16a0: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
16b0: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16e0: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
16f0: 64 69 72 66 64 3b 20 20 20 20 20 20 20 20 20 20  dirfd;          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1710: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1720: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1730: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1740: 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20  char locktype;  
1750: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1760: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1770: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1780: 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20   int lastErrno; 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
17b0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
17c0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
17d0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
17e0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
17f0: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
1800: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
1810: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  e */.  int openF
1820: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1840: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61  lags specified a
1850: 74 20 6f 70 65 6e 20 2a 2f 0a 23 69 66 20 53 51  t open */.#if SQ
1860: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
1870: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
1880: 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f  ux__).  pthread_
1890: 74 20 74 69 64 3b 20 20 20 20 20 20 20 20 20 20  t tid;          
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18b0: 74 68 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e  thread that "own
18c0: 73 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65  s" this unixFile
18d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
18e0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20  S_VXWORKS.  int 
18f0: 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20  isDelete;       
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1910: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
1920: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72  if true */.  str
1930: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
1940: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f 2a  d *pId;       /*
1950: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
1960: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1970: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
1980: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
1990: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
19a0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
19b0: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
19c0: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
19d0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
19e0: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
19f0: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
1a00: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
1a10: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
1a20: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
1a30: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
1a40: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
1a50: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
1a60: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
1a70: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
1a80: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
1a90: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
1aa0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
1ab0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
1ac0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
1ad0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
1ae0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
1af0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
1b00: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
1b10: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
1b20: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
1b30: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1b40: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
1b50: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
1b60: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1b70: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
1b80: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
1b90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1ba0: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
1bb0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
1bc0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
1bd0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
1be0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
1bf0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
1c00: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
1c10: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
1c20: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
1c30: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
1c40: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
1c50: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
1c60: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
1c70: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
1c80: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
1c90: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
1ca0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64  ef __DJGPP__.# d
1cb0: 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c  efine fcntl(A,B,
1cc0: 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C) 0.#endif../*.
1cd0: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
1ce0: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
1cf0: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
1d00: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
1d10: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
1d20: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
1d30: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1d40: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
1d50: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
1d60: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
1d70: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
1d80: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  d 0.#endif.../*.
1d90: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
1da0: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
1db0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
1dc0: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a 2a   global mutex..*
1dd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1de0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  ixEnterMutex(voi
1df0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1e00: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1e10: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1e20: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1e30: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
1e40: 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76  ic void unixLeav
1e50: 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
1e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1e70: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
1e80: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1e90: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
1ea0: 29 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  ));.}...#ifdef S
1eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1ec0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
1ed0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
1ee0: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
1ef0: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
1f00: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
1f10: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
1f20: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
1f30: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
1f40: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
1f50: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
1f60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1f70: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
1f80: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
1f90: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
1fa0: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
1fb0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
1fc0: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
1fd0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
1fe0: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
1ff0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
2000: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
2010: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
2020: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
2030: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
2040: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
2050: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
2060: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
2070: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
2080: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2090: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
20a0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
20b0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
20c0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
20d0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
20e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20f0: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
2100: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
2110: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
2120: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
2130: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
2140: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
2150: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
2160: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
2170: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
2180: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
2190: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
21a0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
21b0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
21c0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
21d0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
21e0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
21f0: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
2200: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
2210: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
2220: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
2230: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
2240: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
2250: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
2260: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
2270: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
2280: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64      s = fcntl(fd
2290: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
22a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22b0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
22c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
22d0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
22e0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
22f0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
2300: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2310: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
2320: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
2330: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
2340: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2350: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2360: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
2370: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2380: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
2390: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
23a0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
23b0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
23c0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
23d0: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
23e0: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
23f0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
2400: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2410: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
2420: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
2430: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
2440: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
2450: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
2460: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
2470: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
2480: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
2490: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
24a0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
24b0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
24c0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
24d0: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
24e0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
24f0: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
2500: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
2510: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
2520: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
2530: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2540: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2550: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2560: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
2570: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2580: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
2590: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
25a0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
25b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
25c0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
25d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
25e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2600: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
2610: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
2620: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
2630: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
2640: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
2650: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
2660: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
2670: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
2680: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66  return s;.}.#def
2690: 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72  ine fcntl lockTr
26a0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
26b0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
26c0: 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */..../*.** This
26d0: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
26e0: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
26f0: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
2700: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
2710: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
2720: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
2730: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
2740: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2750: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
2760: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
2770: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
2780: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
2790: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
27a0: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
27b0: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
27c0: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
27d0: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
27e0: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
27f0: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
2800: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
2810: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
2820: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
2830: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
2840: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
2850: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
2860: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
2870: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
2880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2890: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
28a0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
28b0: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
28c0: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
28d0: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
28e0: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
28f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2900: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
2910: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
2920: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
2930: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
2940: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
2950: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
2960: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
2970: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
2980: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
2990: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
29a0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
29b0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
29c0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
29d0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
29e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
29f0: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
2a00: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
2a10: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
2a20: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
2a30: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
2a40: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
2a50: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
2a60: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
2a70: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
2a80: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
2a90: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
2aa0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
2ab0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
2ac0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2ad0: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
2ae0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
2af0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
2b00: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
2b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b20: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
2b30: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
2b40: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
2b50: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
2b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2b70: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
2b80: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
2b90: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ba0: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
2bb0: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
2bc0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
2bd0: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
2be0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
2bf0: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
2c00: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
2c10: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
2c20: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
2c30: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
2c40: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
2c50: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
2c60: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
2c70: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
2c80: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
2c90: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
2ca0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
2cb0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
2cc0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
2cd0: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
2ce0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
2cf0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
2d00: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
2d10: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
2d20: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
2d30: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
2d40: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
2d50: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
2d60: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
2d70: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
2d80: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
2d90: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
2da0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
2db0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
2dc0: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
2dd0: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
2de0: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
2df0: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
2e00: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
2e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e50: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2e60: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
2e70: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
2e80: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
2e90: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
2ea0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
2eb0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
2ec0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
2ed0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
2ee0: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
2ef0: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
2f00: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
2f10: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
2f20: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
2f30: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
2f40: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
2f50: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
2f60: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
2f70: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
2f80: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
2f90: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
2fa0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
2fb0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2fc0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
2fd0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
2fe0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
2ff0: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
3000: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
3010: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
3020: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
3030: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
3040: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
3050: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
3060: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
3070: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
3080: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
3090: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
30a0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
30b0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
30c0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
30d0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
30e0: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
30f0: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
3100: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
3110: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
3120: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
3130: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
3140: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
3150: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
3160: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
3170: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3180: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
3190: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
31a0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
31b0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
31c0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
31d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31f0: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3200: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
3210: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3230: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
3240: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
3250: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
3260: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
3280: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
3290: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
32a0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
32b0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
32c0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
32d0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
32e0: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
32f0: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
3300: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3310: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
3320: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
3330: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
3340: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
3350: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
3360: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
3370: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3380: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
3390: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
33a0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
33b0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
33c0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
33d0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
33e0: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
33f0: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
3400: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
3410: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
3420: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
3430: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
3440: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
3450: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
3460: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
3470: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
3480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3490: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
34a0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
34b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
34c0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
34d0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
34e0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
34f0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
3500: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
3510: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
3520: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
3530: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
3540: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
3550: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
3560: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
3570: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3580: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
3590: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
35a0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
35b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
35c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
35d0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
35e0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
35f0: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
3600: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3610: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
3620: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
3630: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
3640: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3650: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
3660: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3670: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
3680: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
3690: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
36a0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
36b0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
36c0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
36d0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
36e0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
36f0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
3700: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
3710: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
3720: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
3730: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
3740: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
3750: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
3760: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
3770: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
3780: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
3790: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
37a0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
37b0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
37c0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
37d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
37e0: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
37f0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
3800: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
3810: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
3820: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
3830: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
3840: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
3850: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
3860: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
3870: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
3880: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3890: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
38a0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
38b0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
38c0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
38d0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
38e0: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
38f0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
3900: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
3910: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3940: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
3950: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
3960: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
3970: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
3980: 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  );.  n = strlen(
3990: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
39a0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
39b0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
39c0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
39d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
39e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
39f0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
3a00: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
3a10: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
3a20: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
3a30: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
3a40: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
3a50: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
3a60: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
3a70: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
3a80: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
3a90: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
3aa0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
3ab0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
3ac0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
3ad0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
3ae0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3af0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
3b00: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
3b10: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
3b20: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
3b30: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
3b40: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
3b50: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
3b60: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
3b70: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
3b80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
3b90: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
3ba0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
3bb0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
3bc0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
3bd0: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
3be0: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
3bf0: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
3c00: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
3c10: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
3c20: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
3c30: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
3c40: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
3c50: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
3c60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
3c70: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
3c80: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
3c90: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
3ca0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
3cb0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
3cc0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
3cd0: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
3ce0: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
3cf0: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
3d00: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
3d10: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
3d20: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
3d30: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
3d40: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
3d50: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
3d60: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
3d70: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
3d80: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
3d90: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
3da0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3db0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
3dc0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
3dd0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
3de0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
3df0: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
3e00: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
3e10: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
3e20: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
3e30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
3e40: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
3e50: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
3e60: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
3e70: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
3e80: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
3e90: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
3ea0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
3eb0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
3ec0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
3ed0: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
3ee0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
3ef0: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
3f00: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
3f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3f20: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
3f30: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
3f40: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
3fb0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4000: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
4010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
4020: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
4030: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4050: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
4060: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
4070: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
4080: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
4090: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
40a0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
40b0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
40c0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
40d0: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
40e0: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
40f0: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
4100: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
4110: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
4120: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
4130: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
4140: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
4150: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
4160: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
4170: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
4180: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
4190: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
41a0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
41b0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
41c0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
41d0: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
41e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
41f0: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
4200: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
4210: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
4220: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
4230: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
4240: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
4250: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
4260: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
4270: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
4280: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
4290: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
42a0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
42b0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
42c0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
42d0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
42e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
42f0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
4300: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
4310: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
4320: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
4330: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
4340: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
4350: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
4360: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
4370: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
4380: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
4390: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
43a0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
43b0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
43c0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
43d0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
43e0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
43f0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
4400: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
4410: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
4420: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
4430: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
4440: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
4450: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
4460: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
4470: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
4480: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
4490: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
44a0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
44b0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
44c0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
44d0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
44e0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
44f0: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
4500: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
4510: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
4520: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
4530: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
4540: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
4550: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
4560: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
4570: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
4580: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
4590: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
45a0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
45b0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
45c0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
45d0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
45e0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
45f0: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
4600: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
4610: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
4620: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
4630: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
4640: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
4650: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
4660: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
4670: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
4680: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
4690: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
46a0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
46b0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
46c0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
46d0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
46e0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
46f0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
4700: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
4710: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
4720: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
4730: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
4740: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
4750: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
4760: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
4770: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
4780: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
4790: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
47a0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
47b0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
47c0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
47d0: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
47e0: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
47f0: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
4800: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
4810: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
4820: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
4830: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
4840: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
4850: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
4860: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
4870: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
4880: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
4890: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
48a0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
48b0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
48c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
48d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
48e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
48f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
4900: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
4910: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
4920: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
4930: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
4940: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
4950: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
4960: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
4970: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
4980: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
4990: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
49a0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
49b0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
49c0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
49d0: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
49e0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
49f0: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
4a00: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
4a10: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
4a20: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
4a30: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
4a40: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
4a50: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
4a60: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
4a70: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
4a80: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
4a90: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
4aa0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
4ab0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
4ac0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
4ad0: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
4ae0: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
4af0: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
4b00: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
4b10: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
4b20: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
4b30: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
4b40: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
4b50: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
4b60: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
4b70: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
4b80: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
4b90: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
4ba0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
4bb0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
4bc0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
4bd0: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
4be0: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
4bf0: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
4c00: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
4c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
4c20: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
4c30: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
4c40: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
4c50: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
4c60: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
4c70: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
4c80: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
4c90: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
4ca0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
4cb0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
4cc0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
4cd0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
4ce0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
4cf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75   pointer to an u
4d00: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
4d10: 74 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20  ture.  There is 
4d20: 6f 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  one unixOpenCnt 
4d30: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
4d40: 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69   open inode, whi
4d50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75  ch means that mu
4d60: 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20  ltiple unixFile 
4d70: 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  can point to a s
4d80: 69 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65  ingle.** unixOpe
4d90: 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61  nCnt.  When an a
4da0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
4db0: 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46  o close an unixF
4dc0: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
4dd0: 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46  e.** other unixF
4de0: 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ile open on the 
4df0: 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20  same inode that 
4e00: 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b  are holding lock
4e10: 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74  s, the call.** t
4e20: 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69  o close() the fi
4e30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
4e40: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
4e50: 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
4e60: 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75   clear..** The u
4e70: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
4e80: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
4e90: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
4ea0: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
4eb0: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
4ec0: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
4ed0: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
4ee0: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
4ef0: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
4f00: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
4f10: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
4f20: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
4f30: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
4f40: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
4f50: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
4f60: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
4f70: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
4f80: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
4f90: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
4fa0: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
4fb0: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
4fc0: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
4fd0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
4fe0: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
4ff0: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
5000: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
5010: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
5020: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
5030: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
5040: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
5050: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
5060: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
5070: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
5080: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
5090: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
50a0: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
50b0: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
50c0: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
50d0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
50e0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
50f0: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
5100: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
5110: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
5120: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
5130: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
5140: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
5150: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
5160: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
5170: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
5180: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
5190: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
51a0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
51b0: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57  n thread B..** W
51c0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72  e have to do a r
51d0: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
51e0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
51f0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
5200: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
5210: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65  ..**.** On syste
5220: 6d 73 20 77 68 65 72 65 20 74 68 72 65 61 64 20  ms where thread 
5230: 41 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d  A is unable to m
5240: 6f 64 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61  odify locks crea
5250: 74 65 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64  ted by.** thread
5260: 20 42 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b   B, we have to k
5270: 65 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69  eep track of whi
5280: 63 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65  ch thread create
5290: 64 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20  d each.** lock. 
52a0: 20 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20   Hence there is 
52b0: 61 6e 20 65 78 74 72 61 20 66 69 65 6c 64 20 69  an extra field i
52c0: 6e 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  n the key to the
52d0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a   unixLockInfo.**
52e0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65   structure to re
52f0: 63 6f 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d  cord this inform
5300: 61 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74  ation.  And on t
5310: 68 6f 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a  hose systems it.
5320: 2a 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  ** is illegal to
5330: 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   begin a transac
5340: 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65  tion in one thre
5350: 61 64 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74  ad and finish it
5360: 0a 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20  .** in another. 
5370: 20 46 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72   For this latter
5380: 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68   restriction, th
5390: 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61  ere is no work-a
53a0: 72 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20  round..** It is 
53b0: 61 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20  a limitation of 
53c0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f  LinuxThreads..*/
53d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
53e0: 68 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c  heck the unixFil
53f0: 65 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68  e.tid field.  Th
5400: 69 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  is field is set 
5410: 77 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65  when an unixFile
5420: 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65  .** is first ope
5430: 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ned.  All subseq
5440: 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65  uent uses of the
5450: 20 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79   unixFile verify
5460: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d   that the.** sam
5470: 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72  e thread is oper
5480: 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69  ating on the uni
5490: 78 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65  xFile.  Some ope
54a0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64  rating systems d
54b0: 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c  o.** not allow l
54c0: 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72  ocks to be overr
54d0: 69 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74  idden by other t
54e0: 68 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20  hreads and that 
54f0: 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d  restriction.** m
5500: 65 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65  eans that sqlite
5510: 33 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  3* database hand
5520: 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  les cannot be mo
5530: 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72  ved from one thr
5540: 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65  ead.** to anothe
5550: 72 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72  r while locks ar
5560: 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65  e held..**.** Ve
5570: 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30  rsion 3.3.1 (200
5580: 36 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46  6-01-15):  unixF
5590: 69 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64  ile can be moved
55a0: 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64   from one thread
55b0: 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61   to.** another a
55c0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65  s long as we are
55d0: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79   running on a sy
55e0: 73 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72  stem that suppor
55f0: 74 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76  ts threads.** ov
5600: 65 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74  erriding each ot
5610: 68 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63  hers locks (whic
5620: 68 20 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73  h is now the mos
5630: 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f  t common behavio
5640: 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c  r).** or if no l
5650: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20  ocks are held.  
5660: 42 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65  But the unixFile
5670: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
5680: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
5690: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
56a0: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
56b0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
56c0: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
56d0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
56e0: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
56f0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
5700: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
5710: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
5720: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
5730: 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e  linux__).# defin
5740: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
5750: 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70  )   (X)->tid = p
5760: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20  thread_self().# 
5770: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52  define CHECK_THR
5780: 45 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64  EADID(X) (thread
5790: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
57a0: 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c  ersLocks==0 && \
57b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74               !pt
57d0: 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d  hread_equal((X)-
57e0: 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65  >tid, pthread_se
57f0: 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64  lf())).#else.# d
5800: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
5810: 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43  ID(X).# define C
5820: 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29  HECK_THREADID(X)
5830: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
5840: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5850: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5860: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
5870: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
5880: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
5890: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65  rticular unixOpe
58a0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67  nCnt structure g
58b0: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20  iven its inode. 
58c0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20   This.** is the 
58d0: 73 61 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78  same as the unix
58e0: 4c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  LockKey except t
58f0: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
5900: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
5910: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
5920: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
5930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5940: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
5950: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
5960: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
5970: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
5980: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
5990: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
59a0: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
59b0: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
59c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
59d0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
59e0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
59f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5a00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5a10: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
5a20: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
5a30: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
5a40: 63 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e  cular unixLockIn
5a50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
5a60: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
5a70: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
5a80: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
5a90: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
5aa0: 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c   (LinuxThreads),
5ab0: 20 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20   then we.** set 
5ac0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e  the unixLockKey.
5ad0: 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65  tid field to the
5ae0: 20 74 68 72 65 61 64 20 49 44 2e 20 20 49 66 20   thread ID.  If 
5af0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
5b00: 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68  ride.** each oth
5b10: 65 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78  ers locks (Posix
5b20: 20 61 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20   and NPTL) then 
5b30: 74 69 64 20 69 73 20 61 6c 77 61 79 73 20 73 65  tid is always se
5b40: 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69  t to zero..** ti
5b50: 64 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  d is omitted if 
5b60: 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f  we compile witho
5b70: 75 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70  ut threading sup
5b80: 70 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53  port or on an OS
5b90: 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c  .** other than l
5ba0: 69 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  inux..*/.struct 
5bb0: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20  unixLockKey {.  
5bc0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
5bd0: 64 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75  d fid;  /* Uniqu
5be0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72  e identifier for
5bf0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66   the file */.#if
5c00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
5c10: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
5c20: 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65  linux__).  pthre
5c30: 61 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68  ad_t tid;  /* Th
5c40: 72 65 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20  read ID of lock 
5c50: 6f 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e  owner. Zero if n
5c60: 6f 74 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68  ot using LinuxTh
5c70: 72 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  reads */.#endif.
5c80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
5c90: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
5ca0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5cb0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
5cc0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
5cd0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
5ce0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
5cf0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
5d00: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
5d10: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
5d20: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
5d30: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
5d40: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
5d50: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
5d60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
5d70: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
5d80: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
5d90: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
5da0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
5db0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
5dc0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
5dd0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
5de0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
5df0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
5e00: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
5e10: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
5e20: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  {.  struct unixL
5e30: 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20  ockKey lockKey; 
5e40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
5e50: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63  p key */.  int c
5e60: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5e80: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
5e90: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  ocks held */.  i
5ea0: 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  nt locktype;    
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ec0: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
5ed0: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
5ee0: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  OCK etc. */.  in
5ef0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f10: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
5f20: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
5f30: 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63  cture */.  struc
5f40: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
5f50: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69  pNext;     /* Li
5f60: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f  st of all unixLo
5f70: 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  ckInfo objects *
5f80: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  /.  struct unixL
5f90: 6f 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  ockInfo *pPrev; 
5fa0: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
5fb0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
5fc0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
5fd0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
5fe0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5ff0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
6000: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
6010: 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75  node.  This stru
6020: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
6030: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
6040: 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  of locks on that
6050: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61  .** inode.  If a
6060: 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70   close is attemp
6070: 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69  ted against an i
6080: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c  node that is hol
6090: 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74  ding.** locks, t
60a0: 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65  he close is defe
60b0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c  rred until all l
60c0: 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64  ocks clear by ad
60d0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
60e0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
60f0: 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20  e closed to the 
6100: 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a  pending list..**
6110: 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69  .** TODO:  Consi
6120: 64 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69  der changing thi
6130: 73 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  s so that there 
6140: 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
6150: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
6160: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65  tor for each ope
6170: 6e 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65  n file, even whe
6180: 6e 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d  n it is opened m
6190: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a  ultiple times..*
61a0: 2a 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79  * The close() sy
61b0: 73 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20  stem call would 
61c0: 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
61d0: 74 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73  the last databas
61e0: 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66  e.** using the f
61f0: 69 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73  ile closes..*/.s
6200: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
6210: 74 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  t {.  struct uni
6220: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
6230: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
6240: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  key */.  int nRe
6250: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
6260: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6270: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6280: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6290: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62b0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
62c0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a  anding locks */.
62d0: 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20    int nPending; 
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62f0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   Number of pendi
6300: 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61  ng close() opera
6310: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  tions */.  int *
6320: 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20  aPending;       
6330: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64       /* Malloced
6340: 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66   space holding f
6350: 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63  d's awaiting a c
6360: 6c 6f 73 65 28 29 20 2a 2f 0a 23 69 66 20 4f 53  lose() */.#if OS
6370: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6380: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
63a0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
63b0: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
63c0: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
63d0: 4e 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20 4e 61  NAME+1];   /* Na
63e0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
63f0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hore */.#endif. 
6400: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
6410: 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72  Cnt *pNext, *pPr
6420: 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ev;   /* List of
6430: 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74   all unixOpenCnt
6440: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
6450: 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61  /*.** Lists of a
6460: 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ll unixLockInfo 
6470: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
6480: 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20  objects.  These 
6490: 75 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a  used to be hash.
64a0: 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  ** tables.  But 
64b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  the number of ob
64c0: 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20  jects is rarely 
64d0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65  more than a doze
64e0: 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65  n and.** never e
64f0: 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f  xceeds a few tho
6500: 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b  usand.  And look
6510: 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63  up is not on a c
6520: 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20  ritical.** path 
6530: 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b  so a simple link
6540: 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66  ed list will suf
6550: 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fice..*/.static 
6560: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6570: 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20  nfo *lockList = 
6580: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
6590: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70   unixOpenCnt *op
65a0: 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  enList = 0;../*.
65b0: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
65c0: 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68   remembers wheth
65d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
65e0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
65f0: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
6600: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
6610: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
6620: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
6630: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6640: 2e 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  .  (LinuxThreads
6650: 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ).**    1:  Yes.
6660: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
6670: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
6680: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69  rs locks.  (Posi
6690: 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d  x & NLPT).**   -
66a0: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
66b0: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
66c0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
66d0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
66e0: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
66f0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6700: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
6710: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
6720: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
6730: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6740: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
6750: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
6760: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
6770: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
6780: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
6790: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
67a0: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
67b0: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
67c0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
67d0: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
67e0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
67f0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
6800: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
6810: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
6820: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
6830: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
6840: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
6850: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
6860: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
6870: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
6880: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
6890: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
68a0: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
68b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
68c0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
68d0: 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  DE_LOCK.# define
68e0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
68f0: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
6900: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
6910: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68  LITE_TEST.int th
6920: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
6930: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
6940: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
6950: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73  RRIDE_LOCK;.#els
6960: 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 72  e.static int thr
6970: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
6980: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51  OthersLocks = SQ
6990: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
69a0: 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RIDE_LOCK;.#endi
69b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
69c0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
69d0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
69e0: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
69f0: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
6a00: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
6a10: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6a20: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
6a30: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
6a40: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
6a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a60: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
6a70: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
6a80: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
6a90: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
6aa0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
6ab0: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
6ac0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
6ad0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
6ae0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
6af0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
6b00: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
6b10: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
6b20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6b30: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
6b40: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
6b50: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
6b60: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
6b70: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
6b80: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
6b90: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
6ba0: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
6bb0: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
6bc0: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
6bd0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
6be0: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
6bf0: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
6c00: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
6c10: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
6c20: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
6c30: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
6c40: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
6c50: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
6c60: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
6c70: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
6c80: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
6c90: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
6ca0: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
6cb0: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
6cc0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
6cd0: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
6ce0: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
6cf0: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
6d00: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
6d10: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
6d20: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
6d30: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
6d40: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
6d50: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
6d60: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
6d70: 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  rn pArg;.}.#endi
6d80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
6d90: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
6da0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
6db0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
6dc0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
6dd0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a  ed(__linux__)./*
6de0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
6df0: 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  re attempts to d
6e00: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
6e10: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a   or not threads.
6e20: 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ** can override 
6e30: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
6e40: 73 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20  s then sets the 
6e50: 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72  .** threadsOverr
6e60: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
6e70: 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72  ks variable appr
6e80: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  opriately..*/.st
6e90: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
6ea0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
6eb0: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
6ec0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
6ed0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74  t rc;.  struct t
6ee0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b  hreadTestData d;
6ef0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
6f00: 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  l;.  pthread_t t
6f10: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
6f20: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
6f30: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
6f40: 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a  emset(&l, 0, siz
6f50: 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74  eof(l));.  l.l_t
6f60: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
6f70: 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20   l.l_len = 1;.  
6f80: 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  l.l_start = 0;. 
6f90: 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   l.l_whence = SE
6fa0: 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66  EK_SET;.  rc = f
6fb0: 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f  cntl(fd_orig, F_
6fc0: 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66  SETLK, &l);.  if
6fd0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
6fe0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30  ;.  memset(&d, 0
6ff0: 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20  , sizeof(d));.  
7000: 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c  d.fd = fd;.  d.l
7010: 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63  ock = l;.  d.loc
7020: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
7030: 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72  CK;.  pthread_cr
7040: 65 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65  eate(&t, 0, thre
7050: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26  adLockingTest, &
7060: 64 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f  d);.  pthread_jo
7070: 69 6e 28 74 2c 20 30 29 3b 0a 20 20 63 6c 6f 73  in(t, 0);.  clos
7080: 65 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72  e(fd);.  if( d.r
7090: 65 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72  esult!=0 ) retur
70a0: 6e 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72  n;.  threadsOver
70b0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
70c0: 63 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f  cks = (d.lock.l_
70d0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a  type==F_UNLCK);.
70e0: 7d 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  }.#elif SQLITE_T
70f0: 48 52 45 41 44 53 41 46 45 0a 2f 2a 0a 2a 2a 20  HREADSAFE./*.** 
7100: 4f 6e 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  On anything othe
7110: 72 20 74 68 61 6e 20 6c 69 6e 75 78 2c 20 61 73  r than linux, as
7120: 73 75 6d 65 20 74 68 72 65 61 64 73 20 6f 76 65  sume threads ove
7130: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
7140: 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  s locks..*/.stat
7150: 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65  ic void testThre
7160: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7170: 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a  r(int fd_orig){.
7180: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7190: 45 52 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 74  ER(fd_orig);.  t
71a0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
71b0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
71c0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
71d0: 51 4c 49 54 45 5f 54 48 45 52 41 44 53 41 46 45  QLITE_THERADSAFE
71e0: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
71f0: 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nux__) */../*.**
7200: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4c   Release a unixL
7210: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
7220: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  e previously all
7230: 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f  ocated by findLo
7240: 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61  ckInfo()..*/.sta
7250: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
7260: 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20  LockInfo(struct 
7270: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
7280: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 70 4c 6f 63  ock){.  if( pLoc
7290: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
72a0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
72b0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
72c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  {.      if( pLoc
72d0: 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  k->pPrev ){.    
72e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
72f0: 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  k->pPrev->pNext=
7300: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7310: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e    pLock->pPrev->
7320: 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pNext = pLock->p
7330: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
7340: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7350: 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f  t( lockList==pLo
7360: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f  ck );.        lo
7370: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e  ckList = pLock->
7380: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
7390: 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e       if( pLock->
73a0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
73b0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
73c0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c  pNext->pPrev==pL
73d0: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ock );.        p
73e0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
73f0: 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65  ev = pLock->pPre
7400: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
7410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
7420: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock);.    }.  }.
7430: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
7440: 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73   a unixOpenCnt s
7450: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
7460: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
7470: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
7480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7490: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
74a0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
74b0: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66 28  t *pOpen){.  if(
74c0: 20 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f   pOpen ){.    pO
74d0: 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  pen->nRef--;.   
74e0: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66   if( pOpen->nRef
74f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7500: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b   pOpen->pPrev ){
7510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7520: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
7530: 4e 65 78 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20  Next==pOpen );. 
7540: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50         pOpen->pP
7550: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70  rev->pNext = pOp
7560: 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  en->pNext;.     
7570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7580: 61 73 73 65 72 74 28 20 6f 70 65 6e 4c 69 73 74  assert( openList
7590: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
75a0: 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f     openList = pO
75b0: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
75c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f    }.      if( pO
75d0: 70 65 6e 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  pen->pNext ){.  
75e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
75f0: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
7600: 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  v==pOpen );.    
7610: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74      pOpen->pNext
7620: 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d  ->pPrev = pOpen-
7630: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
7640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7650: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
7660: 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ng);.      sqlit
7670: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
7680: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7690: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
76a0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
76b0: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
76c0: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
76d0: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a  structures that.
76e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
76f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
7700: 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f  r.  Create new o
7710: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
7720: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
7730: 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65   values might be
7740: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
7750: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7760: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
7770: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
7780: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
7790: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63  atic int findLoc
77a0: 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  kInfo(.  unixFil
77b0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
77d0: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
77e0: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
77f0: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
7800: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70  unixLockInfo **p
7810: 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72  pLock,  /* Retur
7820: 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  n the unixLockIn
7830: 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72  fo structure her
7840: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
7850: 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70  ixOpenCnt **ppOp
7860: 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  en    /* Return 
7870: 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  the unixOpenCnt 
7880: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
7890: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
78c0: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
78d0: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
7900: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7910: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
7920: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f  t unixLockKey lo
7930: 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f  ckKey;    /* Loo
7940: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
7950: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
7960: 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75  ucture */.  stru
7970: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
7980: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
7990: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
79a0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
79b0: 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  uct */.  struct 
79c0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
79d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
79e0: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
79f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  ation */.  struc
7a00: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
7a10: 70 4c 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 61 6e  pLock;    /* Can
7a20: 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49  didate unixLockI
7a30: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  nfo object */.  
7a40: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
7a50: 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f  nt *pOpen;     /
7a60: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
7a70: 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a  OpenCnt object *
7a80: 2f 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  /..  /* Get low-
7a90: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
7aa0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
7ab0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
7ac0: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
7ad0: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
7ae0: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
7af0: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
7b00: 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  h;.  rc = fstat(
7b10: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
7b20: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
7b30: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
7b40: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
7b50: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
7b60: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
7b70: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
7b80: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7b90: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
7ba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7bb0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _IOERR;.  }..  /
7bc0: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
7bd0: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
7be0: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
7bf0: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
7c00: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
7c10: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
7c20: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
7c30: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
7c40: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
7c50: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
7c60: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
7c70: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
7c80: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
7c90: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
7ca0: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
7cb0: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
7cc0: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
7cd0: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
7ce0: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
7cf0: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
7d00: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
7d10: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
7d20: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
7d30: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
7d40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
7d50: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
7d60: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
7d70: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
7d80: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
7d90: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
7da0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
7db0: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
7dc0: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
7dd0: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
7de0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
7df0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
7e00: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
7e10: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
7e20: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
7e30: 30 20 29 7b 0a 20 20 20 20 77 72 69 74 65 28 66  0 ){.    write(f
7e40: 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20  d, "S", 1);.    
7e50: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
7e60: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
7e70: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
7e80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7e90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
7ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7eb0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
7ec0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b  .  memset(&lockK
7ed0: 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f  ey, 0, sizeof(lo
7ee0: 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b  ckKey));.  lockK
7ef0: 65 79 2e 66 69 64 2e 64 65 76 20 3d 20 73 74 61  ey.fid.dev = sta
7f00: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
7f10: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f   OS_VXWORKS.  lo
7f20: 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64 20 3d 20  ckKey.fid.pId = 
7f30: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
7f40: 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  e.  lockKey.fid.
7f50: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
7f60: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  _ino;.#endif.#if
7f70: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
7f80: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
7f90: 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20 74  linux__).  if( t
7fa0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7fb0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20  chOthersLocks<0 
7fc0: 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61  ){.    testThrea
7fd0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
7fe0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b  (fd);.  }.  lock
7ff0: 4b 65 79 2e 74 69 64 20 3d 20 74 68 72 65 61 64  Key.tid = thread
8000: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
8010: 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70  ersLocks ? 0 : p
8020: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23  thread_self();.#
8030: 65 6e 64 69 66 0a 20 20 66 69 6c 65 49 64 20 3d  endif.  fileId =
8040: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20   lockKey.fid;.  
8050: 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b  if( ppLock!=0 ){
8060: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63  .    pLock = loc
8070: 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  kList;.    while
8080: 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d  ( pLock && memcm
8090: 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f  p(&lockKey, &pLo
80a0: 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a  ck->lockKey, siz
80b0: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b  eof(lockKey)) ){
80c0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
80d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
80e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b   }.    if( pLock
80f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==0 ){.      pLo
8100: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ck = sqlite3_mal
8110: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f  loc( sizeof(*pLo
8120: 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ck) );.      if(
8130: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8140: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8150: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8160: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
8170: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a  ckinfo;.      }.
8180: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
8190: 6b 4b 65 79 20 3d 20 6c 6f 63 6b 4b 65 79 3b 0a  kKey = lockKey;.
81a0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65        pLock->nRe
81b0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 6f  f = 1;.      pLo
81c0: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ck->cnt = 0;.   
81d0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
81e0: 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  pe = 0;.      pL
81f0: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f 63  ock->pNext = loc
8200: 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 6f  kList;.      pLo
8210: 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ck->pPrev = 0;. 
8220: 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c 69 73       if( lockLis
8230: 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50  t ) lockList->pP
8240: 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20  rev = pLock;.   
8250: 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c     lockList = pL
8260: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
8270: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65        pLock->nRe
8280: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
8290: 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  ppLock = pLock;.
82a0: 20 20 7d 0a 20 20 69 66 28 20 70 70 4f 70 65 6e    }.  if( ppOpen
82b0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e  !=0 ){.    pOpen
82c0: 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20   = openList;.   
82d0: 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26 26   while( pOpen &&
82e0: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
82f0: 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2c   &pOpen->fileId,
8300: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
8310: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20   ){.      pOpen 
8320: 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a  = pOpen->pNext;.
8330: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
8340: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
8350: 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pOpen = sqlite3_
8360: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
8370: 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  pOpen) );.      
8380: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
8390: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c          releaseL
83a0: 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a  ockInfo(pLock);.
83b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
83c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
83d0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
83e0: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20  dlockinfo;.     
83f0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e   }.      pOpen->
8400: 66 69 6c 65 49 64 20 3d 20 66 69 6c 65 49 64 3b  fileId = fileId;
8410: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
8420: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ef = 1;.      pO
8430: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a  pen->nLock = 0;.
8440: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
8450: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
8460: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
8470: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
8480: 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c  n->pNext = openL
8490: 69 73 74 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ist;.      pOpen
84a0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
84b0: 20 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20     if( openList 
84c0: 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65  ) openList->pPre
84d0: 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20  v = pOpen;.     
84e0: 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65   openList = pOpe
84f0: 6e 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  n;.#if OS_VXWORK
8500: 53 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70  S.      pOpen->p
8510: 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Sem = NULL;.    
8520: 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d    pOpen->aSemNam
8530: 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 23 65 6e  e[0] = '\0';.#en
8540: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
8550: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
8560: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ++;.    }.    *p
8570: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20  pOpen = pOpen;. 
8580: 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63   }..exit_findloc
8590: 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20  kinfo:.  return 
85a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
85b0: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
85c0: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
85d0: 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20  thread than the 
85e0: 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a  thread that the.
85f0: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75  ** unixFile argu
8600: 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c  ment belongs to,
8610: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f   then transfer o
8620: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
8630: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72  unixFile.** over
8640: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
8650: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
8660: 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79  unixFile is only
8670: 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65   owned by a thre
8680: 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68  ad on systems th
8690: 61 74 20 75 73 65 20 4c 69 6e 75 78 54 68 72 65  at use LinuxThre
86a0: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72  ads..**.** Owner
86b0: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
86c0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66   only allowed if
86d0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
86e0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
86f0: 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75  ked..** If the u
8700: 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65  nixFile is locke
8710: 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68  d and an ownersh
8720: 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65  ip is wrong, the
8730: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  n return.** SQLI
8740: 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49  TE_MISUSE.  SQLI
8750: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
8760: 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
8770: 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  works..*/.#if SQ
8780: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8790: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
87a0: 75 78 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  ux__).static int
87b0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
87c0: 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ip(unixFile *pFi
87d0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
87e0: 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66   pthread_t hSelf
87f0: 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f  ;.  if( threadsO
8800: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
8810: 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a  sLocks ){.    /*
8820: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
8830: 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20  fers not needed 
8840: 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a  on this system *
8850: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
8860: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53  ITE_OK;.  }.  hS
8870: 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65  elf = pthread_se
8880: 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72  lf();.  if( pthr
8890: 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d  ead_equal(pFile-
88a0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a  >tid, hSelf) ){.
88b0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74      /* We are st
88c0: 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ill in the same 
88d0: 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53  thread */.    OS
88e0: 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73  TRACE1("No-trans
88f0: 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64  fer, same thread
8900: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
8910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8920: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
8930: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
8940: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e  {.    /* We cann
8950: 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73  ot change owners
8960: 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65  hip while we are
8970: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21   holding a lock!
8980: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
8990: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
89a0: 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 72  }.  OSTRACE4("Tr
89b0: 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70  ansfer ownership
89c0: 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74   of %d from %d t
89d0: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
89e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
89f0: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
8a00: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20  );.  pFile->tid 
8a10: 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70  = hSelf;.  if (p
8a20: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e  File->pLock != N
8a30: 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61  ULL) {.    relea
8a40: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
8a50: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63  ->pLock);.    rc
8a60: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
8a70: 70 46 69 6c 65 2c 20 26 70 46 69 6c 65 2d 3e 70  pFile, &pFile->p
8a80: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f 53  Lock, 0);.    OS
8a90: 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20  TRACE5("LOCK    
8aa0: 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c  %d is now %s(%s,
8ab0: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
8ac0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
8ad0: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
8ae0: 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20  >locktype),.    
8af0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
8b00: 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  ame(pFile->pLock
8b10: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69  ->locktype), pFi
8b20: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b  le->pLock->cnt);
8b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8b40: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
8b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a  .  }.}.#else  /*
8b70: 20 69 66 20 6e 6f 74 20 53 51 4c 49 54 45 5f 54   if not SQLITE_T
8b80: 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 20 20 2f  HREADSAFE */.  /
8b90: 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65  * On single-thre
8ba0: 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e  aded builds, own
8bb0: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20  ership transfer 
8bc0: 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20  is a no-op */.# 
8bd0: 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f  define transferO
8be0: 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c 49  wnership(X) SQLI
8bf0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20  TE_OK.#endif /* 
8c00: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8c10: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  E */.../*.** Thi
8c20: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
8c30: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
8c40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
8c50: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
8c60: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
8c70: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
8c80: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
8c90: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
8ca0: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
8cb0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
8cc0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
8cd0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
8ce0: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
8cf0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
8d00: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
8d10: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
8d20: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
8d30: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
8d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d50: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
8d60: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
8d70: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
8d80: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
8d90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
8da0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
8db0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
8dc0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
8dd0: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
8de0: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
8df0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
8e00: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
8e10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
8e20: 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  le );.  unixEnte
8e30: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
8e40: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
8e50: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
8e60: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
8e70: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
8e80: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
8e90: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
8ea0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
8eb0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
8ec0: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
8ed0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
8ee0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
8ef0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
8f00: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
8f10: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
8f20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  .  */.  if( !res
8f30: 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72  erved ){.    str
8f40: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
8f50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
8f60: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
8f70: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
8f80: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
8f90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
8fa0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
8fb0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
8fc0: 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e     if (-1 == fcn
8fd0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
8fe0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a  ETLK, &lock)) {.
8ff0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
9000: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
9010: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
9020: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
9030: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
9040: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
9050: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46  DLOCK);.      pF
9060: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9070: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65   tErrno;.    } e
9080: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
9090: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
90a0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
90b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
90c0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
90d0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28  x();.  OSTRACE4(
90e0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
90f0: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
9100: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
9110: 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
9120: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
9130: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9140: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
9150: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
9160: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
9170: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
9180: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
9190: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
91a0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
91b0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
91c0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
91d0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
91e0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
91f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
9200: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
9210: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
9220: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
9230: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
9240: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
9250: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
9260: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
9270: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
9280: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
9290: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
92a0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
92b0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
92c0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
92d0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
92e0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
92f0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
9300: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
9310: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
9320: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
9330: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
9340: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
9350: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
9360: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
9370: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
9380: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
9390: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
93a0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
93b0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
93c0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
93d0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
93e0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
93f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9400: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
9410: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
9420: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
9430: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
9440: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
9450: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
9460: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9470: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
9480: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
9490: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
94a0: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
94b0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
94c0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
94d0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
94e0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
94f0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
9500: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
9510: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
9520: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
9530: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
9540: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
9550: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
9560: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
9570: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
9580: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
9590: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
95a0: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
95b0: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
95c0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
95d0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
95e0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
95f0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
9600: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
9610: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
9620: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
9630: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
9640: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
9650: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
9660: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
9670: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
9680: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
9690: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
96a0: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
96b0: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
96c0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
96d0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
96e0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
96f0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
9700: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
9710: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
9720: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
9730: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
9740: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
9750: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
9760: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
9770: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
9780: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
9790: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
97a0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
97b0: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
97c0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
97d0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
97e0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
97f0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
9800: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
9810: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
9820: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
9830: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
9840: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
9850: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
9860: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
9870: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
9880: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
9890: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
98a0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
98b0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
98c0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
98d0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
98e0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
98f0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
9900: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
9910: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
9920: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
9930: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
9940: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9950: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
9960: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
9970: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
9980: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
9990: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
99a0: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
99b0: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
99c0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
99d0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
99e0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
99f0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
9a00: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
9a10: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
9a20: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
9a30: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
9a40: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
9a50: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
9a60: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
9a70: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
9a80: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
9a90: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
9aa0: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
9ab0: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
9ac0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
9ad0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
9ae0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
9af0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
9b00: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
9b10: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
9b20: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
9b30: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
9b40: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
9b50: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
9b60: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
9b70: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
9b80: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
9b90: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
9ba0: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
9bb0: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
9bc0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
9bd0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
9be0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
9bf0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
9c00: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
9c10: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
9c20: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
9c30: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
9c40: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
9c50: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
9c60: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
9c70: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
9c80: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
9c90: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
9ca0: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
9cb0: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
9cc0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
9cd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9ce0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
9cf0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
9d00: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
9d10: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
9d20: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
9d30: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
9d40: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
9d50: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
9d60: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
9d70: 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE7("LOCK    %d 
9d80: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
9d90: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
9da0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  e->h,.      lock
9db0: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
9dc0: 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
9dd0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
9de0: 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70  ),.      locktyp
9df0: 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63  eName(pLock->loc
9e00: 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63  ktype), pLock->c
9e10: 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  nt , getpid());.
9e20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
9e30: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
9e40: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
9e50: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
9e60: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
9e70: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
9e80: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
9e90: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
9ea0: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
9eb0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
9ec0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
9ed0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
9ee0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
9ef0: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
9f00: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f      OSTRACE3("LO
9f10: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
9f20: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22  already held)\n"
9f30: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
9f40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9f50: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b  Name(locktype));
9f60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9f70: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
9f80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
9f90: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
9fa0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
9fb0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
9fc0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
9fd0: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
9fe0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9ff0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
a000: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
a010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
a020: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
a030: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
a040: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
a050: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
a060: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
a070: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
a080: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
a090: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
a0a0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
a0b0: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
a0c0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
a0d0: 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e  rrent thread own
a0e0: 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a  s the pFile..  *
a0f0: 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65  /.  rc = transfe
a100: 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65  rOwnership(pFile
a110: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a120: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
a130: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a140: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a150: 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69   }.  pLock = pFi
a160: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  le->pLock;..  /*
a170: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
a180: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
a190: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
a1a0: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
a1b0: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
a1c0: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
a1d0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
a1e0: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
a1f0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
a200: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f  e->locktype!=pLo
a210: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20  ck->locktype && 
a220: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63  .          (pLoc
a230: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  k->locktype>=PEN
a240: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  DING_LOCK || loc
a250: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
a260: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
a270: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
a280: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a290: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
a2a0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
a2b0: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
a2c0: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
a2d0: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
a2e0: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
a2f0: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
a300: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
a310: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
a320: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
a330: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
a340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
a350: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
a360: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f  K && .      (pLo
a370: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  ck->locktype==SH
a380: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  ARED_LOCK || pLo
a390: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  ck->locktype==RE
a3a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
a3b0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
a3c0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
a3d0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a3e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a3f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
a400: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  t( pLock->cnt>0 
a410: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
a420: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
a430: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
a440: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c  >cnt++;.    pFil
a450: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
a460: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
a470: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63  lock;.  }..  loc
a480: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20  k.l_len = 1L;.. 
a490: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a4a0: 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a   SEEK_SET;..  /*
a4b0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
a4c0: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
a4d0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
a4e0: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
a4f0: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
a500: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
a510: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
a520: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
a530: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
a540: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
a550: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
a560: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a570: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
a580: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
a590: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
a5a0: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
a5b0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
a5c0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63  ck.l_type = (loc
a5d0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a5e0: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
a5f0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
a600: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
a610: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
a620: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a630: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a640: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
a650: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
a660: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
a670: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
a680: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
a690: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
a6a0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
a6b0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
a6c0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
a6d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
a6e0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
a6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
a700: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
a710: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
a720: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
a730: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
a740: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
a750: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
a760: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
a770: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
a780: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
a790: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
a7a0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a7b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   ){.    int tErr
a7c0: 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  no = 0;.    asse
a7d0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  rt( pLock->cnt==
a7e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a7f0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
a800: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
a810: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
a820: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
a830: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
a840: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
a850: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
a860: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
a870: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a880: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a890: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
a8a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
a8b0: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
a8c0: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
a8d0: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
a8e0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
a8f0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
a900: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
a910: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
a920: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
a930: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
a940: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a950: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
a960: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
a970: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
a980: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
a990: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
a9a0: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
a9b0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
a9c0: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
a9d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a9e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a9f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
aa00: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
aa10: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
aa20: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
aa30: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
aa40: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
aa50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aa60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
aa70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
aa80: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
aa90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
aaa0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
aab0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
aac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
aad0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
aae0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
aaf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
ab00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
ab10: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
ab20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ab30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
ab40: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
ab50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65       pFile->pOpe
ab60: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
ab70: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31    pLock->cnt = 1
ab80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
ab90: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
aba0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
abb0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a  pLock->cnt>1 ){.
abc0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
abd0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
abe0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
abf0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
ac00: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
ac10: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
ac20: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
ac30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
ac40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
ac50: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
ac60: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
ac70: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
ac80: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
ac90: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
aca0: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
acb0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
acc0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
acd0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
ace0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
acf0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
ad00: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
ad10: 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ype );.    lock.
ad20: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
ad30: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f  ;.    switch( lo
ad40: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  cktype ){.      
ad50: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
ad60: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
ad70: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
ad80: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
ad90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ada0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
adb0: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
adc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
add0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ade0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
adf0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
ae00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae10: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
ae20: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
ae30: 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  }.    s = fcntl(
ae40: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
ae50: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
ae60: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
ae70: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
ae80: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
ae90: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
aea0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
aeb0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
aec0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
aed0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
aee0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
aef0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
af00: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
af10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
af20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
af30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
af40: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
af50: 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  ktype;.    pLock
af60: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
af70: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
af80: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
af90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
afa0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
afb0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
afc0: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
afd0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
afe0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
aff0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
b000: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
b010: 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
b020: 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %s %s\n", pFile
b030: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
b040: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
b050: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
b060: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
b070: 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
b080: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
b090: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
b0a0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
b0b0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
b0c0: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
b0d0: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
b0e0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
b0f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
b100: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
b110: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
b120: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b130: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
b140: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
b150: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
b160: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
b170: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
b180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b190: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
b1a0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
b1b0: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75  ocktype){.  stru
b1c0: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
b1d0: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
b1e0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
b1f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b200: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
b210: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
b220: 2a 29 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a  *)id;.  int h;..
b230: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
b240: 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55  );.  OSTRACE7("U
b250: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
b260: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
b270: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
b280: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
b290: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
b2a0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
b2b0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
b2c0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
b2d0: 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
b2e0: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
b2f0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
b300: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b310: 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
b320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b330: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
b340: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
b350: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
b360: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
b370: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
b380: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
b390: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b  File->h;.  pLock
b3a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
b3b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
b3c0: 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
b3d0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b3e0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
b3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
b400: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46  ck->locktype==pF
b410: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
b420: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
b430: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
b440: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
b450: 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
b460: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b470: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 69  Benign(0);.    i
b480: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b490: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
b4a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b4b0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_RDLCK;.      l
b4c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
b4d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
b4e0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
b4f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
b500: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
b510: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
b520: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
b530: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
b540: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
b550: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
b560: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
b570: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
b580: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
b590: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
b5a0: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
b5b0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b5c0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b5d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b5e0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b5f0: 20 20 20 20 20 20 20 7d 0a 09 09 09 09 67 6f 74         }.....got
b600: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
b610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b620: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b630: 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
b640: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b650: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
b660: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
b670: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
b680: 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
b690: 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
b6a0: 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
b6b0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  E );.    if( fcn
b6c0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
b6d0: 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20  lock)!=(-1) ){. 
b6e0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
b6f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b700: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
b710: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
b720: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
b730: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b740: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b750: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b760: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
b770: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
b780: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
b790: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b7a0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
b7b0: 20 20 20 20 7d 0a 09 09 09 67 6f 74 6f 20 65 6e      }....goto en
b7c0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  d_unlock;.    }.
b7d0: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
b7e0: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe==NO_LOCK ){. 
b7f0: 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70     struct unixOp
b800: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
b810: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
b820: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
b830: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
b840: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
b850: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
b860: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
b870: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
b880: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
b890: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
b8a0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
b8b0: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
b8c0: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
b8d0: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
b8e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
b8f0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
b900: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b910: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b920: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b930: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
b940: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
b950: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
b960: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
b970: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
b980: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
b990: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
b9a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
b9b0: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
b9c0: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
b9d0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
b9e0: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
b9f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ba00: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
ba10: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ba20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
ba30: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
ba40: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
ba50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
ba60: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
ba70: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ba80: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ba90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
baa0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
bab0: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e         pLock->cn
bac0: 74 20 3d 20 31 3b 0a 09 09 09 09 67 6f 74 6f 20  t = 1;.....goto 
bad0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
bae0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
baf0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
bb00: 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61  count of locks a
bb10: 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65  gainst this same
bb20: 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65   file.  When the
bb30: 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65  .    ** count re
bb40: 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73  aches zero, clos
bb50: 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65  e any other file
bb60: 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f   descriptors who
bb70: 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  se close.    ** 
bb80: 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63  was deferred bec
bb90: 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64  ause of outstand
bba0: 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a  ing locks..    *
bbb0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
bbc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bbd0: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
bbe0: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70  pOpen;.      pOp
bbf0: 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  en->nLock--;.   
bc00: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
bc10: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
bc20: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e      if( pOpen->n
bc30: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e  Lock==0 && pOpen
bc40: 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a  ->nPending>0 ){.
bc50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
bc60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
bc70: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  i<pOpen->nPendin
bc80: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
bc90: 20 20 20 2f 2a 20 63 6c 6f 73 65 20 70 65 6e 64     /* close pend
bca0: 69 6e 67 20 66 64 73 2c 20 62 75 74 20 69 66 20  ing fds, but if 
bcb0: 63 6c 6f 73 69 6e 67 20 66 61 69 6c 73 20 64 6f  closing fails do
bcc0: 6e 27 74 20 66 72 65 65 20 74 68 65 20 61 72 72  n't free the arr
bcd0: 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
bce0: 61 73 73 69 67 6e 20 2d 31 20 74 6f 20 74 68 65  assign -1 to the
bcf0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c   successfully cl
bd00: 6f 73 65 64 20 64 65 73 63 72 69 70 74 6f 72 73  osed descriptors
bd10: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a   and record the.
bd20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72            ** err
bd30: 6f 72 2e 20 20 54 68 65 20 6e 65 78 74 20 61 74  or.  The next at
bd40: 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f 63 6b 20  tempt to unlock 
bd50: 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e 2e 20  will try again. 
bd60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
bd70: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
bd80: 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e  [i] < 0 ) contin
bd90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
bda0: 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61  ( close(pOpen->a
bdb0: 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a 20  Pending[i]) ){. 
bdc0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
bdd0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
bde0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
bdf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
be00: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
be10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
be20: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
be30: 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a  ending[i] = -1;.
be40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
be50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
be60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
be80: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d  ite3_free(pOpen-
be90: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
bea0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
beb0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
bec0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
bed0: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
bee0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bef0: 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f  }.  }...end_unlo
bf00: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
bf10: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
bf20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
bf30: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
bf40: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
bf50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bf60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
bf70: 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
bf80: 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
bf90: 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
bfa0: 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
bfb0: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
bfc0: 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
bfd0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
bfe0: 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
bff0: 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
c000: 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
c010: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
c020: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
c030: 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
c040: 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
c050: 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
c060: 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
c070: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c080: 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
c090: 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
c0a0: 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
c0b0: 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
c0c0: 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
c0d0: 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
c0e0: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
c0f0: 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
c100: 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
c110: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
c120: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c130: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
c140: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  File ){.    if( 
c150: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
c160: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
c170: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
c180: 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69 66  dirfd);.      if
c190: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
c1a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c1b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c1c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c1d0: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
c1e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c1f0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69         pFile->di
c200: 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  rfd=-1;.      }.
c210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
c220: 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
c230: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f     int err = clo
c240: 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  se(pFile->h);.  
c250: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
c260: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c270: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
c280: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c290: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
c2a0: 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
c2b0: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
c2c0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
c2d0: 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pId ){.      if(
c2e0: 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65   pFile->isDelete
c2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69   ){.        unli
c300: 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
c310: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
c320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 78        }.      vx
c330: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
c340: 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
c350: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64        pFile->pId
c360: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
c370: 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  if.    OSTRACE2(
c380: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
c390: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  , pFile->h);.   
c3a0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
c3b0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  ;.    memset(pFi
c3c0: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
c3d0: 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20  ixFile));.  }.  
c3e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c3f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
c400: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
c410: 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
c420: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
c430: 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  d){.  int rc = S
c440: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c450: 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
c460: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c470: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20  xFile *)id;.    
c480: 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  unixUnlock(id, N
c490: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
c4a0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
c4b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f     if( pFile->pO
c4c0: 70 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f  pen && pFile->pO
c4d0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  pen->nLock ){.  
c4e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
c4f0: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
c500: 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
c510: 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
c520: 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
c530: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
c540: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
c550: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
c560: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
c570: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
c580: 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65  scriptor to pOpe
c590: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  n->aPending.  It
c5a0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
c5b0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
c5c0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
c5d0: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
c5e0: 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
c5f0: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a       int *aNew;.
c600: 20 20 20 20 20 20 73 74 72 75 63 74 20 75 6e 69        struct uni
c610: 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20  xOpenCnt *pOpen 
c620: 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
c630: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
c640: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70  ite3_realloc(pOp
c650: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70  en->aPending, (p
c660: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31  Open->nPending+1
c670: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
c680: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
c690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c6a0: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   If a malloc fai
c6b0: 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68  ls, just leak th
c6c0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c6d0: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  r */.      }else
c6e0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  {.        pOpen-
c6f0: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
c700: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
c710: 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d  >aPending[pOpen-
c720: 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69  >nPending] = pFi
c730: 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70  le->h;.        p
c740: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
c750: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
c760: 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  >h = -1;.      }
c770: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
c780: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
c790: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
c7a0: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
c7b0: 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
c7c0: 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
c7d0: 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
c7e0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
c7f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c800: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c810: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
c820: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
c830: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c850: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
c920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c940: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
c950: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
c960: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
c970: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
c980: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
c990: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
c9a0: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
c9b0: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
c9c0: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
c9d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
c9e0: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
c9f0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
ca00: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
ca10: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
ca20: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
ca30: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
ca40: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
ca50: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
ca60: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
ca70: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
ca80: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
ca90: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
caa0: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
cab0: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
cac0: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
cad0: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
cae0: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
caf0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
cb00: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
cb10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
cb20: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
cb30: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
cb40: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
cb50: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
cb60: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
cb70: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
cb80: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
cb90: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
cba0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
cbb0: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
cbc0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
cbd0: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
cbe0: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
cbf0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
cc00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
cc10: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
cc20: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
cc30: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
cc40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
cc50: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
cc60: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
cc70: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
cc80: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
cc90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
cca0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
ccb0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
ccc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
ccd0: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
cce0: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
ccf0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
cd00: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
cd10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd20: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
cd30: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
cd40: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
cd50: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
cd60: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
cd70: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
cd80: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
cd90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cda0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
cdb0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
cdc0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
cdd0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
cde0: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
cdf0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
ce00: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
ce20: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
ce30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
ce40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce50: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
ce60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cea0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
ceb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cef0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
cf00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
cf10: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
cf20: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
cf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf40: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
cf50: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
cf60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
cf70: 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  es the existing 
cf80: 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b  of separate lock
cf90: 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72 64  .** files in ord
cfa0: 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  er to control ac
cfb0: 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
cfc0: 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
cfd0: 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f  s on just.** abo
cfe0: 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
cff0: 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
d000: 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
d010: 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
d020: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
d030: 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
d040: 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
d050: 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
d060: 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
d070: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
d080: 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
d090: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
d0a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
d0b0: 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
d0c0: 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
d0d0: 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
d0e0: 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
d0f0: 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
d100: 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
d110: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
d120: 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
d130: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
d140: 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
d150: 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
d160: 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
d170: 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
d180: 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
d190: 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
d1a0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
d1b0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
d1c0: 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 66   by creating a f
d1d0: 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ile in the same 
d1e0: 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
d1f0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64  .** database and
d200: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
d210: 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
d220: 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
d230: 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
d240: 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f  xistance of a lo
d250: 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73 20  ck file implies 
d260: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
d270: 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f  k.  All other lo
d280: 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48 41  ck.** types (SHA
d290: 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50  RED, RESERVED, P
d2a0: 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70  ENDING) are mapp
d2b0: 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56  ed into EXCLUSIV
d2c0: 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  E..*/../*.** The
d2d0: 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64   file suffix add
d2e0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62  ed to the data b
d2f0: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  ase filename in 
d300: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
d310: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65  the.** lock file
d320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
d330: 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
d340: 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
d350: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
d360: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
d370: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
d380: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
d390: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
d3a0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
d3b0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
d3c0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
d3d0: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
d3e0: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
d3f0: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
d400: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
d410: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
d420: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
d430: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
d440: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
d450: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
d460: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
d470: 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
d480: 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
d490: 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
d4a0: 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
d4b0: 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
d4c0: 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
d4d0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
d4e0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
d4f0: 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
d500: 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
d510: 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
d520: 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
d530: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
d540: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
d550: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
d560: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
d570: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
d580: 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
d590: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
d5a0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
d5b0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d5c0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d5d0: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
d5e0: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
d5f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
d600: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
d610: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
d620: 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
d630: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
d640: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
d650: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
d660: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
d670: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
d680: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  D_LOCK ){.    /*
d690: 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e   Either this con
d6a0: 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20  nection or some 
d6b0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
d6c0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
d6d0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64  cess.    ** hold
d6e0: 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  s a lock on the 
d6f0: 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  file.  No need t
d700: 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e  o check further.
d710: 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64   */.    reserved
d720: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
d730: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69     /* The lock i
d740: 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e  s held if and on
d750: 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69  ly if the lockfi
d760: 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
d770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
d780: 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20  ckFile = (const 
d790: 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
d7a0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
d7b0: 20 72 65 73 65 72 76 65 64 20 3d 20 61 63 63 65   reserved = acce
d7c0: 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
d7d0: 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
d7e0: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
d7f0: 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70  K %d %d %d\n", p
d800: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
d810: 65 72 76 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f  erved);.  *pResO
d820: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
d830: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d840: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
d850: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
d860: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
d870: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
d880: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
d890: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
d8a0: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
d8b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
d8c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
d8d0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
d8e0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
d8f0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
d900: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
d910: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
d920: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
d930: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
d940: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
d950: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
d960: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
d970: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
d980: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
d990: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
d9a0: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
d9b0: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
d9c0: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
d9d0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
d9e0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
d9f0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
da00: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
da10: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
da20: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
da30: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
da40: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
da50: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
da60: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
da70: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
da80: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
da90: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
daa0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
dab0: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
dac0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
dad0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
dae0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
db00: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
db10: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
db20: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
db30: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
db40: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
db50: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
db60: 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
db70: 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
db80: 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
db90: 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
dba0: 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
dbb0: 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
dbc0: 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
dbd0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
dbe0: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
dbf0: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
dc00: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
dc10: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
dc20: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
dc30: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
dc40: 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  t fd;.  char *zL
dc50: 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
dc60: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
dc70: 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
dc80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
dc90: 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
dca0: 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
dcb0: 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
dcc0: 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
dcd0: 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
dce0: 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
dcf0: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
dd00: 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
dd10: 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
dd20: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
dd30: 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  e > NO_LOCK ){. 
dd40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
dd50: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 23  pe = locktype;.#
dd60: 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
dd70: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
dd80: 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
dd90: 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
dda0: 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28  e */.    utimes(
ddb0: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
ddc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
ddd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dde0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
ddf0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
de00: 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e  k */.  fd = open
de10: 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f  (zLockFile,O_RDO
de20: 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  NLY|O_CREAT|O_EX
de30: 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20  CL,0600);.  if( 
de40: 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  fd<0 ){.    /* f
de50: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
de60: 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73  eate the file, s
de70: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20  omeone else may 
de80: 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20  have stolen the 
de90: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
dea0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
deb0: 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d      if( EEXIST =
dec0: 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
ded0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
dee0: 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
def0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
df00: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
df10: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
df20: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
df30: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
df40: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
df50: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
df60: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
df70: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
df80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
df90: 0a 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f 73  .  } .  if( clos
dfa0: 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69  e(fd) ){.    pFi
dfb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dfc0: 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
dfd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
dfe0: 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  SE;.  }.  .  /* 
dff0: 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
e000: 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
e010: 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c  ok */.  pFile->l
e020: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
e030: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
e040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e050: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e060: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e070: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
e080: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
e090: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
e0a0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
e0b0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
e0c0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
e0d0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
e0e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
e0f0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
e100: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
e110: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
e120: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
e130: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
e140: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
e150: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
e160: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
e170: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
e180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e190: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
e1a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e1b0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
e1c0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e1d0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e1e0: 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
e1f0: 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
e200: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
e210: 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  text;..  assert(
e220: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
e230: 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
e240: 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
e250: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
e260: 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46  locktype,..   pF
e270: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
e280: 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65  etpid());.  asse
e290: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
e2a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
e2b0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
e2c0: 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
e2d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
e2e0: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
e2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e300: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
e310: 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
e320: 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
e330: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
e340: 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
e350: 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
e360: 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
e370: 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
e380: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
e390: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
e3a0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
e3b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e3c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
e3d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e3e0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
e3f0: 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
e400: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
e410: 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
e420: 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
e430: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
e440: 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e  K );.  if( unlin
e450: 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a  k(zLockFile) ){.
e460: 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
e470: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e480: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
e490: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
e4a0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e4b0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e4c0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e4d0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
e4e0: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
e4f0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
e500: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e510: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e520: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e530: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
e540: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
e550: 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
e560: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e570: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
e580: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
e590: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
e5a0: 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
e5b0: 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
e5c0: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
e5d0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
e5e0: 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  id) {.  int rc;.
e5f0: 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
e600: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e610: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e620: 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
e630: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
e640: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
e650: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
e660: 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
e670: 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
e680: 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  le(id);.  return
e690: 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
e6b0: 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
e6c0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
e6d0: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
e6e0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e730: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e780: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7a0: 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
e7b0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
e7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
e7e0: 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
e7f0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
e800: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
e810: 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
e820: 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
e830: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
e840: 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
e850: 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
e860: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
e870: 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
e880: 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
e890: 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
e8a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
e8b0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
e8c0: 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
e8d0: 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
e8e0: 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
e8f0: 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
e900: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
e910: 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
e920: 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
e930: 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
e940: 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
e950: 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
e960: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
e970: 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
e980: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
e990: 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
e9a0: 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
e9b0: 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
e9c0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
e9d0: 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
e9e0: 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
e9f0: 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
ea00: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
ea10: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ea20: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
ea30: 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
ea40: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
ea50: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
ea60: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
ea70: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
ea80: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
ea90: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
eaa0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
eab0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
eac0: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
ead0: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
eae0: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
eaf0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
eb00: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
eb10: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
eb20: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
eb30: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
eb40: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
eb50: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
eb60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
eb70: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
eb80: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
eb90: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
eba0: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
ebb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ebc0: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
ebd0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ebe0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ebf0: 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
ec00: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
ec10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
ec20: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
ec30: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
ec40: 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
ec50: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
ec60: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
ec70: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
ec80: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
ec90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
eca0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ecb0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
ecc0: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
ecd0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
ece0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
ecf0: 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
ed00: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
ed10: 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
ed20: 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
ed30: 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c      int lrc = fl
ed40: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
ed50: 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
ed60: 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
ed70: 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
ed80: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
ed90: 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
eda0: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
edb0: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
edc0: 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
edd0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
ede0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
edf0: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
ee00: 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
ee10: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63  r */.        lrc
ee20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ee30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ee40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
ee50: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
ee60: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ee70: 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
ee80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ee90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
eea0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
eeb0: 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
eec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
eed0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
eee0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
eef0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
ef00: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
ef10: 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
ef20: 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
ef30: 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
ef40: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ef50: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ef60: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
ef70: 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
ef80: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
ef90: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
efa0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
efb0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
efc0: 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
efd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
efe0: 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
eff0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
f000: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
f010: 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 23 69  , reserved);..#i
f020: 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
f030: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
f040: 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
f050: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
f060: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
f070: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f080: 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
f090: 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
f0a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
f0b0: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
f0c0: 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
f0d0: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
f0e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f0f0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
f100: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
f110: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
f120: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
f130: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
f140: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
f150: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
f160: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
f170: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
f180: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
f190: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
f1a0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
f1b0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
f1c0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
f1d0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
f1e0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
f1f0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
f200: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
f210: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
f220: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
f230: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
f240: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
f250: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
f260: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
f270: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
f280: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
f290: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
f2a0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
f2b0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
f2c0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
f2d0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
f2e0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
f2f0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
f300: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
f310: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
f320: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
f330: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
f340: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
f350: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
f360: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
f370: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f380: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
f390: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
f3a0: 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
f3b0: 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
f3c0: 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
f3d0: 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
f3e0: 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
f3f0: 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
f400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
f410: 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
f420: 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
f430: 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
f440: 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
f450: 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
f460: 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
f470: 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
f480: 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
f490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f4a0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
f4b0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
f4c0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
f4d0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
f4e0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
f4f0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
f500: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
f510: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f520: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f530: 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e) {.  int rc = 
f540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
f550: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f560: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
f570: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
f580: 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
f590: 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
f5a0: 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
f5b0: 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
f5c0: 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
f5d0: 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
f5e0: 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
f5f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20  ile->locktype > 
f600: 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
f610: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
f620: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
f630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f640: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
f650: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
f660: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
f670: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f680: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
f690: 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
f6a0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f6b0: 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
f6c0: 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
f6d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f6e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f6f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f700: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
f710: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f720: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
f730: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f740: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f750: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
f760: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
f770: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
f780: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
f790: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
f7a0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  = locktype;.  }.
f7b0: 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b    OSTRACE4("LOCK
f7c0: 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
f7d0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
f7e0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
f7f0: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
f800: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
f810: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
f820: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
f830: 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
f840: 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
f850: 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
f860: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
f870: 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
f880: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23  LITE_BUSY;.  }.#
f890: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f8a0: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
f8b0: 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65  K_ERRORS */.  re
f8c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
f8d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
f8e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
f8f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
f900: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
f910: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
f920: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
f930: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
f940: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
f950: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f960: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
f970: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
f980: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
f990: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
f9a0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
f9b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f9c0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f9d0: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
f9e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f9f0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
fa00: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
fa10: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fa20: 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
fa30: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
fa40: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
fa50: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
fa60: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
fa70: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
fa80: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
fa90: 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
faa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
fab0: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
fac0: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
fad0: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
fae0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
faf0: 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
fb00: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
fb10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fb20: 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
fb30: 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
fb40: 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
fb50: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
fb60: 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
fb70: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
fb80: 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
fb90: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
fba0: 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
fbb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fbc0: 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
fbd0: 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
fbe0: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
fbf0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
fc00: 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20  );.  if (rc) {. 
fc10: 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f     int r, tErrno
fc20: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20   = errno;.    r 
fc30: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
fc40: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
fc50: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
fc60: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
fc70: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
fc80: 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  r) ){.      pFil
fc90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fca0: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66  Errno;.    }.#if
fcb0: 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
fcc0: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
fcd0: 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26  ORS.    if( (r &
fce0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
fcf0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
fd00: 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49  {.      r = SQLI
fd10: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23  TE_BUSY;.    }.#
fd20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fd30: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
fd40: 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
fd50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20  .    return r;. 
fd60: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46   } else {.    pF
fd70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
fd80: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
fd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fda0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
fdb0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
fdc0: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
fdd0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
fde0: 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
fdf0: 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
fe00: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
fe10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c  .  }.  return cl
fe20: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
fe30: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
fe40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
fe50: 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
fe60: 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a  _VXWORK */../***
fe70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe80: 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63   End of the floc
fe90: 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  k lock implement
fea0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
fec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
ff10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff70: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65  ***** Begin Name
ff80: 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b  d Semaphore Lock
ff90: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
ffa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
ffb0: 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
ffc0: 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
ffd0: 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
ffe0: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53  VxWorks..**.** S
fff0: 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
10000 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63   is like dot-loc
10010 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74  k and flock in t
10020 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e  hat it really on
10030 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45  ly.** supports E
10040 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
10050 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
10060 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61   process can rea
10070 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68  d or write.** th
10080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10090 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
100a0 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69   reduces potenti
100b0 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20  al concurrency, 
100c0 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  but.** makes the
100d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
100e0 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72  tion much easier
100f0 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ..*/.#if OS_VXWO
10100 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
10110 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10120 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10130 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10140 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
10150 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
10160 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
10170 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
10180 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
10190 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
101a0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
101b0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
101c0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
101d0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
101e0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
101f0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10200 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
10210 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10220 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
10230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
10240 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
10250 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10260 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
10270 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
10280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
10290 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
102a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
102b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
102c0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
102d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
102e0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
102f0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
10300 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
10310 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
10320 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
10330 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
10340 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
10350 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10360 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
10370 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
10380 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
10390 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
103a0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
103b0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
103c0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
103d0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
103e0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
103f0 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a  e->pOpen->pSem;.
10400 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
10410 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
10420 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
10430 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
10440 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10450 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
10460 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
10470 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10480 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10490 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
104a0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
104b0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
104c0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
104d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
104e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
104f0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
10500 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
10510 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
10520 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
10530 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
10540 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 6c  rved = (pFile->l
10550 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45 44  ocktype < SHARED
10560 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
10570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10580 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
10590 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
105a0 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
105b0 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
105c0 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  }.  }.  OSTRACE4
105d0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
105e0 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c  d %d %d\n", pFil
105f0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
10600 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  ed);..  *pResOut
10610 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
10620 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10630 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
10640 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
10650 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
10660 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
10670 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
10680 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
10690 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
106a0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
106b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
106c0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
106d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
106e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
106f0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
10700 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
10710 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
10720 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
10730 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
10740 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
10750 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
10760 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
10770 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
10780 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
10790 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
107a0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
107b0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
107c0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
107d0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
107e0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
107f0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
10800 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
10810 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
10820 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
10830 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
10840 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
10850 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
10860 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
10870 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
10880 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
10890 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
108a0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
108b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
108c0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
108d0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
108e0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
108f0 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
10900 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
10910 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
10920 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
10930 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
10940 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
10950 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
10960 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
10970 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
10980 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
10990 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
109a0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
109b0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
109c0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
109d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
109e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
109f0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
10a00 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
10a10 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
10a20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
10a30 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
10a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a50 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  semLock(sqlite3_
10a60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
10a70 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
10a80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10a90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
10aa0 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
10ab0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  pSem = pFile->pO
10ac0 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  pen->pSem;.  int
10ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10ae0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
10af0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
10b00 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
10b10 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
10b20 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
10b30 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
10b40 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
10b50 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
10b60 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
10b70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
10b80 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63  locktype;.    rc
10b90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10ba0 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
10bb0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
10bc0 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
10bd0 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
10be0 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
10bf0 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
10c00 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
10c10 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
10c20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
10c30 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
10c40 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
10c50 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
10c60 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
10c70 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
10c80 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10c90 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  e;.. sem_end_loc
10ca0 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
10cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
10cc0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10cd0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
10ce0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
10cf0 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
10d00 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
10d10 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
10d20 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
10d30 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
10d40 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
10d50 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10d60 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
10d70 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
10d80 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
10d90 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
10da0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10db0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
10dc0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10dd0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10de0 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
10df0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10e00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
10e10 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
10e20 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20  >pOpen->pSem;.. 
10e30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
10e50 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
10e60 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
10e70 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %d pid=%d\n", 
10e80 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
10e90 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c  pe,..   pFile->l
10ea0 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
10eb0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  ));.  assert( lo
10ec0 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
10ed0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
10ee0 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
10ef0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10f00 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
10f10 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
10f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10f30 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
10f40 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
10f50 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
10f60 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
10f70 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
10f80 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
10f90 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
10fa0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
10fb0 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
10fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10fd0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
10fe0 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
10ff0 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
11000 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
11010 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
11020 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
11030 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11040 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11050 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11060 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
11070 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11080 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
11090 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
110a0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
110b0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
110c0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
110d0 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
110e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
110f0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
11100 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
11110 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
11120 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
11130 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
11140 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
11150 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11160 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
11170 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
11180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
11190 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
111a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
111b0 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
111c0 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
111d0 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
111e0 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  Cnt(pFile->pOpen
111f0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
11200 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
11210 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
11240 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
11250 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  */./*.** Named s
11260 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
11270 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
11280 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  le on VxWorks..*
11290 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
112a0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d  * End of the nam
112b0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
112c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
112d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
112e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
112f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11330 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
113a0 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e  Begin AFP Lockin
113b0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73  ***.**.** AFP is
113e0 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e   the Apple Filin
113f0 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50  g Protocol.  AFP
11400 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69   is a network fi
11410 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a  lesystem found.*
11420 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e  * on Apple Macin
11430 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d  tosh computers -
11440 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53   both OS9 and OS
11450 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70  X..**.** Third-p
11460 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74  arty implementat
11470 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20  ions of AFP are 
11480 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
11490 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a  this code here.*
114a0 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  * only works on 
114b0 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  OSX..*/..#if def
114c0 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29  ined(__DARWIN__)
114d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
114e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
114f0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
11500 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
11510 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
11520 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
11530 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
11540 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
11550 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
11560 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11570 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
11580 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
11590 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
115a0 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  g sharedByte;.  
115b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
115c0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
115d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
115e0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
115f0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
11600 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
11610 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
11620 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
11630 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
11640 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
11650 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
11660 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
11670 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
11680 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
11690 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
116a0 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
116b0 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
116c0 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
116d0 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
116e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
116f0 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
11700 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
11710 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
11720 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
11730 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
11740 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
11750 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
11760 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
11770 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
117a0 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
117b0 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
117c0 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
117d0 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
117e0 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
117f0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
11800 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
11810 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
11820 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
11830 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
11840 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
11850 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
11860 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
11870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11880 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
11890 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
118a0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
118b0 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
118c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
118d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
118e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
118f0 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
11900 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
11910 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11930 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
11940 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
11950 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
11960 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
11970 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
11980 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
11990 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
119a0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
119b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
119c0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
119d0 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
119e0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
119f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
11a00 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
11a10 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
11a20 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
11a30 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
11a40 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
11a50 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
11a60 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
11a70 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
11a80 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
11a90 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
11aa0 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
11ab0 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
11ac0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 2f   = pFile->h;.  /
11ad0 2f 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72  /SimulateIOError
11ae0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 2f 2f 53  Benign(1);.  //S
11af0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
11b00 70 62 2e 66 64 3d 28 2d 31 29 20 29 0a 20 20 2f  pb.fd=(-1) ).  /
11b10 2f 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72  /SimulateIOError
11b20 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 0a 20 20  Benign(0);.  .  
11b30 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45 54  OSTRACE6("AFPSET
11b40 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
11b50 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
11b60 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
11b70 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
11b80 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
11b90 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
11ba0 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
11bb0 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
11bc0 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  gth);.  err = fs
11bd0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
11be0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
11bf0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
11c00 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
11c10 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
11c20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11c30 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  no;.    OSTRACE4
11c40 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
11c50 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
11c60 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
11c70 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
11c80 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
11c90 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66 64  r(tErrno));.#ifd
11ca0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
11cb0 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
11cc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11cd0 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20  _BUSY;.#else.   
11ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11cf0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11d00 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11d10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c              setL
11d20 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45  ockFlag ? SQLITE
11d30 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51  _IOERR_LOCK : SQ
11d40 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11d50 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  K);.#endif /* SQ
11d60 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
11d70 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
11d80 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11d90 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
11da0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11db0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11dc0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
11dd0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
11de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11df0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
11e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11e10 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11e20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11e30 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
11e40 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
11e50 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
11e60 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
11e70 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
11e80 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
11e90 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11ea0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11eb0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11ec0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11ed0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11ee0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11ef0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11f00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11f10 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11f20 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11f30 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
11f40 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11f50 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11f60 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
11f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11f80 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
11f90 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
11fa0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11fb0 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
11fc0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
11fd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11fe0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
11ff0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12000 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66  t( pFile );.  af
12010 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12020 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
12030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
12040 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
12050 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
12060 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12070 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12080 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12090 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
120a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
120b0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
120c0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
120d0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
120e0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
120f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
12100 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
12110 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
12120 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
12130 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
12140 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
12150 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
12160 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
12170 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
12180 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
12190 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
121a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
121b0 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
121c0 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
121d0 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
121e0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
121f0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
12200 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
12210 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
12220 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
12230 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
12240 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
12250 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
12260 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
12270 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
12280 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
12290 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
122a0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
122b0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
122c0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
122d0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
122e0 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
122f0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54    }.  }.  .  OST
12300 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
12310 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
12320 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12330 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a  eserved);.  .  *
12340 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
12350 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
12360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12370 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12380 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12390 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
123a0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
123b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
123c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
123d0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
123e0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
123f0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12400 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12410 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12420 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12430 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12440 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12450 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12460 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12470 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12480 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12490 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
124a0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
124b0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
124c0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
124d0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
124e0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
124f0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
12500 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
12510 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
12520 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
12530 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12540 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12550 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12560 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12570 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12580 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12590 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
125a0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
125b0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
125c0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
125d0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
125e0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
125f0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
12600 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
12610 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
12620 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
12630 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12640 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
12650 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
12660 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
12670 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
12680 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
12690 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
126a0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
126b0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
126c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
126d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
126e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
126f0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
12700 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
12710 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
12720 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
12730 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
12740 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12750 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
12760 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
12770 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  was %s pid=%d\n"
12780 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
12790 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
127a0 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
127b0 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
127c0 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70  >locktype), getp
127d0 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
127e0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
127f0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
12800 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
12810 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
12820 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
12830 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
12840 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
12850 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
12860 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
12870 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
12880 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
12890 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
128a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
128b0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
128c0 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
128d0 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
128e0 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
128f0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
12900 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
12910 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
12920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12930 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
12940 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
12950 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
12960 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
12970 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
12980 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
12990 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
129a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
129b0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
129c0 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
129d0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
129e0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
129f0 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
12a00 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
12a10 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
12a20 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
12a30 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
12a40 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
12a50 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
12a60 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
12a70 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
12a80 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
12a90 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
12aa0 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
12ab0 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
12ac0 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
12ad0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12ae0 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
12af0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
12b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12b10 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
12b20 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
12b30 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
12b40 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
12b50 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
12b60 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
12b70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
12b80 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
12b90 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
12ba0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
12bb0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
12bc0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
12bd0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
12be0 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
12bf0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
12c00 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
12c10 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
12c20 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
12c30 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
12c40 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
12c50 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
12c60 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
12c70 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
12c80 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
12c90 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
12ca0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
12cb0 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
12cc0 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
12cd0 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
12ce0 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
12cf0 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
12d00 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
12d10 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
12d20 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
12d30 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
12d40 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
12d50 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12d60 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63 31 2c 20    int lk, lrc1, 
12d70 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b  lrc2, lrc1Errno;
12d80 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  .    .    /* Now
12d90 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
12da0 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
12db0 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
12dc0 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
12dd0 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
12de0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
12df0 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
12e00 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
12e10 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68  .    context->sh
12e20 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
12e30 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
12e40 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
12e50 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
12e60 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12e70 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
12e80 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
12e90 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
12ea0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
12eb0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
12ec0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
12ed0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
12ee0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
12ef0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
12f00 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
12f10 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
12f20 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
12f30 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
12f40 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
12f50 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
12f60 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
12f70 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12f80 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
12f90 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12fa0 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
12fb0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
12fc0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
12fd0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
12fe0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
12ff0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
13000 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
13010 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
13020 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
13030 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
13040 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
13050 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
13060 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
13070 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
13080 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
13090 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
130a0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
130b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
130c0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
130d0 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
130e0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
130f0 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
13100 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
13110 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
13120 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
13130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13140 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
13150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
13160 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
13170 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
13180 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
13190 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e    if (locktype >
131a0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
131b0 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
131c0 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe < RESERVED_LO
131d0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
131e0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
131f0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
13200 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
13210 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
13220 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13230 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
13240 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
13250 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
13260 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
13270 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
13280 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
13290 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
132a0 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
132b0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
132c0 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
132d0 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
132e0 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
132f0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
13300 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13310 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
13320 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
13330 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
13340 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
13350 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
13360 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13370 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
13380 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
133b0 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
133c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
133d0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
133e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
133f0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
13400 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
13410 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
13420 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
13430 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
13440 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13450 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
13480 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
13490 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
134a0 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
134b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
134c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
134d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
134e0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
134f0 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78  D_FIRST + contex
13500 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  t->sharedByte, 1
13510 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 1)) ){.       
13520 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73     /* Can't rees
13530 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
13540 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65  ed lock.  Sqlite
13550 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69   can't deal, thi
13560 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  s is.          *
13570 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f  * a critical I/O
13580 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
13590 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
135a0 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51   = ((failed & SQ
135b0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
135c0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
135d0 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
135e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
135f0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
13600 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
13610 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
13620 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
13630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
13640 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
13650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
13660 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
13670 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
13680 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
13690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
136a0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
136b0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
136c0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
136d0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
136e0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
136f0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
13700 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
13710 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
13720 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13730 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
13740 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
13750 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
13760 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
13770 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ype), .         
13780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13790 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
137a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
137b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
137c0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
137d0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
137e0 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
137f0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
13800 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13810 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13820 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13830 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13840 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13850 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13860 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13870 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
13880 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
13890 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
138a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
138b0 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
138c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
138d0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
138e0 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pe) {.  int rc =
138f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13900 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13910 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13920 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13930 78 74 20 2a 70 43 74 78 20 3d 20 28 61 66 70 4c  xt *pCtx = (afpL
13940 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
13950 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
13960 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
13970 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13980 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
13990 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
139a0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
139b0 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
139c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
139d0 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
139e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
139f0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
13a00 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
13a10 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
13a20 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
13a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a40 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
13a50 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
13a60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a70 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
13a80 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13a90 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
13aa0 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
13ab0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a 20 20 20  LOCK ){.    .   
13ac0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
13ad0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
13ae0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13af0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
13b00 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
13b10 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
13b20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
13b30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13b40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
13b50 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13b60 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK ){.        /*
13b70 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
13b80 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
13b90 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
13ba0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
13bb0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
13bc0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74  SHARED_FIRST+pCt
13bd0 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  x->sharedByte;. 
13be0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
13bf0 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50  etLock(pCtx->dbP
13c00 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
13c10 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
13c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13c30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13c40 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
13c50 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
13c60 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
13c70 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
13c80 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
13c90 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
13ca0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
13cb0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
13cc0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
13cd0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
13ce0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
13cf0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
13d00 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
13d10 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
13d20 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
13d30 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
13d40 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
13d50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63 6c 65 61  K ){.    /* clea
13d60 72 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  r the shared loc
13d70 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 68 61  k */.    int sha
13d80 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
13d90 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d  ARED_FIRST+pCtx-
13da0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
13db0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
13dc0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
13dd0 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
13de0 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Byte, 1, 0);.  }
13df0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13e10 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
13e20 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  CK ){.      stru
13e30 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
13e40 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
13e50 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65  Open;.      pOpe
13e60 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
13e70 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
13e80 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
13e90 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c     if( pOpen->nL
13ea0 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d  ock==0 && pOpen-
13eb0 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20  >nPending>0 ){. 
13ec0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
13ed0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13ee0 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  <pOpen->nPending
13ef0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13f00 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50 65    if( pOpen->aPe
13f10 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20 63  nding[i] < 0 ) c
13f20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13f30 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 4f 70     if( close(pOp
13f40 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29  en->aPending[i])
13f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13f60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13f70 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
13f80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13f90 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20  E_IOERR_CLOSE;. 
13fa0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 65              pOpe
13fc0 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3d  n->aPending[i] =
13fd0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
13fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14020 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
14030 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e  .          pOpen
14040 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
14050 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d            pOpen-
14060 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
14070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14080 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61  .    }.  }.end_a
14090 66 70 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  fpunlock:.  unix
140a0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
140b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
140c0 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  K ) pFile->lockt
140d0 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
140e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
140f0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
14100 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
14110 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
14120 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
14130 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
14140 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14150 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
14160 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
14170 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14180 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
14190 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
141a0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
141b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
141c0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26   pFile->pOpen &&
141d0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
141e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
141f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
14200 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
14210 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
14220 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
14230 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
14240 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
14250 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
14260 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
14270 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
14280 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
14290 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
142a0 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
142b0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
142c0 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
142d0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
142e0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
142f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14300 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  nt *aNew;.      
14310 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
14320 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c  nt *pOpen = pFil
14330 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20  e->pOpen;.      
14340 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
14350 65 61 6c 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61 50  ealloc(pOpen->aP
14360 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e  ending, (pOpen->
14370 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65  nPending+1)*size
14380 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 20  of(int) );.     
14390 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
143a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
143b0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75  malloc fails, ju
143c0 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  st leak the file
143d0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
143e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
143f0 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
14400 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ing = aNew;.    
14410 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
14420 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ing[pOpen->nPend
14430 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  ing] = pFile->h;
14440 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
14450 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20  nPending++;.    
14460 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
14470 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14480 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
14490 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  Cnt(pFile->pOpen
144a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
144b0 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
144c0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
144d0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
144e0 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
144f0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
14500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14510 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
14520 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
14530 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14540 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14550 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
14560 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
14570 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14580 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14590 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
145a0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
145b0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
145c0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
145d0 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
145e0 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
145f0 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14600 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14610 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
14620 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
14630 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
14640 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
14660 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
14670 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14680 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14690 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146e0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14750 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
14760 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a  *********.**.**.
14790 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
147a0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
147b0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
147c0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
147d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
147e0 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
147f0 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
14800 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
14810 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
14820 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
14830 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
14840 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
14850 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
14860 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
14870 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
14880 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
14890 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
148a0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
148b0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
148c0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
148d0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
148e0 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
148f0 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
14900 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
14910 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
14920 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
14930 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
14940 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
14950 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
14960 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
14970 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
14980 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
14990 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
149a0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
149b0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
149c0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
149d0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
149e0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
149f0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
14a00 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
14a10 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
14a20 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
14a30 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
14a40 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
14a50 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
14a60 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
14a70 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
14a80 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
14a90 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
14aa0 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
14ab0 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
14ac0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
14ad0 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
14ae0 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
14af0 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
14b00 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
14b10 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
14b20 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
14b30 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
14b40 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
14b50 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
14b60 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
14b70 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
14b80 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
14b90 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
14ba0 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
14bb0 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
14bc0 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
14bd0 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
14be0 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
14bf0 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
14c00 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
14c10 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
14c20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
14c30 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
14c40 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
14c50 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
14c60 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
14c70 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
14c80 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
14c90 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
14ca0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
14cb0 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
14cc0 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
14cd0 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
14ce0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
14cf0 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
14d00 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
14d10 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
14d20 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
14d30 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
14d40 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
14d50 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
14d60 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
14d70 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
14d80 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
14d90 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
14da0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
14db0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
14dc0 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
14dd0 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
14de0 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
14df0 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
14e00 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
14e10 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
14e20 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
14e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14e40 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
14e50 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
14e60 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
14e70 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
14e80 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
14e90 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
14ea0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
14eb0 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
14ec0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
14ed0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
14ee0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
14ef0 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
14f20 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
14f30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
14f40 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
14f50 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
14f60 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
14f70 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
14f80 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
14f90 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
14fa0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
14fb0 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
14fc0 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
14fd0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
14fe0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
14ff0 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
15000 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
15010 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
15020 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
15030 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
15040 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
15050 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
15060 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
15070 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
15080 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
15090 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
150a0 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
150b0 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
150c0 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
150d0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
150e0 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
150f0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
15100 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
15110 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
15120 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
15130 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
15140 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
15150 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
15160 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
15170 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
15180 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
15190 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
151a0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
151b0 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
151c0 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
151d0 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
151e0 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
151f0 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
15200 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
15210 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15220 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
15230 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
15240 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
15250 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
15260 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
15270 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
15280 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
15290 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
152a0 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
152b0 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
152c0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
152d0 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
152e0 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
152f0 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15310 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
15320 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
15330 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
15340 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
15350 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
15360 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
15370 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
15380 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
15390 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
153a0 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
153b0 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
153c0 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
153d0 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
153e0 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
153f0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
15400 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
15410 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
15420 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
15430 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
15440 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
15450 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
15460 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
15470 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
15480 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
15490 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
154a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
154b0 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
154c0 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
154d0 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
154e0 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
154f0 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
15500 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
15510 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
15520 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
15530 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
15540 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
15550 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
15560 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
15570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15580 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
15590 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
155a0 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
155b0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
155c0 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
155d0 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
155e0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
155f0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
15600 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
15610 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
15620 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
15630 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
15640 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
15650 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
15660 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
15670 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
15680 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
15690 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
156a0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
156b0 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
156c0 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
156d0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
156e0 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
156f0 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
15700 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
15710 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
15720 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
15730 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
15740 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
15750 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
15760 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
15770 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
15780 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
15790 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
157a0 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
157b0 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
157c0 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
157d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
157e0 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
157f0 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
15800 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
15810 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
15820 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
15830 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
15840 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
15850 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
15860 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
15870 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
15880 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
15890 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  *.** There is a 
158a0 74 68 69 72 64 20 66 69 6c 65 20 2d 20 74 68 65  third file - the
158b0 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20 2d 20   host ID file - 
158c0 75 73 65 64 20 61 73 20 61 20 70 65 72 73 69 73  used as a persis
158d0 74 65 6e 74 20 72 65 63 6f 72 64 0a 2a 2a 20 6f  tent record.** o
158e0 66 20 61 20 75 6e 69 71 75 65 20 69 64 65 6e 74  f a unique ident
158f0 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 68 6f  ifier for the ho
15900 73 74 2c 20 61 20 31 32 38 2d 62 79 74 65 20 75  st, a 128-byte u
15910 6e 69 71 75 65 20 68 6f 73 74 20 69 64 20 66 69  nique host id fi
15920 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 74  le.** in the pat
15930 68 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65  h defined by the
15940 20 48 4f 53 54 49 44 50 41 54 48 20 6d 61 63 72   HOSTIDPATH macr
15950 6f 20 28 64 65 66 61 75 6c 74 20 76 61 6c 75 65  o (default value
15960 20 69 73 0a 2a 2a 20 2f 4c 69 62 72 61 72 79 2f   is.** /Library/
15970 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c  Caches/.com.appl
15980 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48 6f 73  e.sqliteConchHos
15990 74 49 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  tId)..**.** Requ
159a0 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
159b0 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
159c0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
159d0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
159e0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
159f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
15a00 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
15a10 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
15a20 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
15a30 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
15a40 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
15a50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
15a60 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
15a70 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
15a80 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
15a90 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
15aa0 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
15ab0 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
15ac0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
15ad0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
15ae0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
15af0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
15b00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
15b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
15b20 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
15b30 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
15b40 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
15b50 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
15b60 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
15b70 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
15b80 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
15b90 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
15ba0 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
15bb0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
15bc0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
15be0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
15bf0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
15c00 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
15c10 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
15c20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
15c30 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
15c40 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
15c50 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
15c60 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
15c70 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
15c80 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
15c90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
15ca0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
15cb0 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
15cc0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
15cd0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
15ce0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
15cf0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
15d00 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
15d10 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
15d20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
15d30 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
15d40 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
15d50 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
15d60 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 48 4f 53 54 49  ion.**.**  HOSTI
15d70 44 50 41 54 48 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DPATH.**.**     
15d80 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
15d90 64 65 66 61 75 6c 74 20 68 6f 73 74 20 49 44 20  default host ID 
15da0 66 69 6c 65 20 70 61 74 68 20 6c 6f 63 61 74 69  file path locati
15db0 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
15dc0 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
15dd0 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
15de0 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
15df0 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
15e00 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
15e10 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
15e20 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
15e30 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
15e40 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
15e50 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
15e60 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
15e70 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
15e80 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
15e90 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
15ea0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
15eb0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
15ec0 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
15ed0 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
15ee0 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
15ef0 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
15f00 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
15f10 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
15f20 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
15f30 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
15f40 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
15f50 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
15f60 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
15f70 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
15f80 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
15f90 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
15fa0 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
15fb0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
15fc0 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
15fd0 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
15fe0 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
15ff0 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
16000 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
16010 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
16020 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
16030 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
16040 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
16050 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
16060 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
16070 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
16080 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
16090 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
160a0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
160b0 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
160c0 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
160d0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
160e0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
160f0 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
16100 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20  (__DARWIN__) && 
16110 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
16120 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
16130 2a 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  ** Forward refer
16140 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ence.*/.static i
16150 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
16160 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
16170 20 2a 70 56 66 73 2c 0a 20 20 69 6e 74 20 68 2c   *pVfs,.  int h,
16180 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 0a 20 20  .  int dirfd,.  
16190 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
161a0 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
161b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e  *zFilename,.  in
161c0 74 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20  t noLock,.  int 
161d0 69 73 44 65 6c 65 74 65 0a 29 3b 0a 0a 0a 23 69  isDelete.);...#i
161e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
161f0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
16200 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
16210 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
16220 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
16230 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
16240 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
16250 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
16260 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
16270 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
16280 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
16290 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
162a0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
162b0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
162c0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
162d0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
162e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
162f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
16300 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
16310 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
16320 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
16330 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
16340 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
16350 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
16360 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
16370 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16380 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
16390 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
163a0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
163b0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
163c0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
163d0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
163e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
163f0 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
16400 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
16410 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
16420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
16430 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
16440 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
16450 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
16460 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
16470 68 65 20 63 6f 6e 63 68 20 69 73 20 63 75 72 72  he conch is curr
16480 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a 20 20  ently held */.  
16490 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
164a0 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
164b0 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
164c0 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
164d0 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
164e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
164f0 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
16500 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
16510 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
16520 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
16530 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c 45 4e  };../* HOSTIDLEN
16540 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20 62 6f   and CONCHLEN bo
16550 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61 63 65  th include space
16560 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20   for the string 
16570 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  .** terminating 
16580 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  nul .*/.#define 
16590 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20 20 20  HOSTIDLEN       
165a0 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20 43 4f    128.#define CO
165b0 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20 20 20  NCHLEN          
165c0 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f 53 54  (MAXPATHLEN+HOST
165d0 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64 65 66  IDLEN+1).#ifndef
165e0 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20 64 65   HOSTIDPATH.# de
165f0 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54 48 20  fine HOSTIDPATH 
16600 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72 79 2f        "/Library/
16610 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c  Caches/.com.appl
16620 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48 6f 73  e.sqliteConchHos
16630 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  tId".#endif../* 
16640 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f 70 79  basically a copy
16650 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65   of unixRandomne
16660 73 73 20 77 69 74 68 20 64 69 66 66 65 72 65 6e  ss with differen
16670 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61 76 69  t.** test behavi
16680 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f 0a 73  or built in */.s
16690 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
166a0 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28 63 68  enerateHostID(ch
166b0 61 72 20 2a 70 48 6f 73 74 49 44 29 7b 0a 20 20  ar *pHostID){.  
166c0 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 69 2c 20  int pid, fd, i, 
166d0 6c 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  len;.  unsigned 
166e0 63 68 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e 73  char *key = (uns
166f0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 48 6f  igned char *)pHo
16700 73 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73 65  stID;.  .  memse
16710 74 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49 44  t(key, 0, HOSTID
16720 4c 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30 3b  LEN);.  len = 0;
16730 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64  .  fd = open("/d
16740 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
16750 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66 64  DONLY);.  if( fd
16760 3e 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  >=0 ){.    len =
16770 20 72 65 61 64 28 66 64 2c 20 6b 65 79 2c 20 48   read(fd, key, H
16780 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 63  OSTIDLEN);.    c
16790 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
167a0 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  ently leak the f
167b0 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f  d if it fails */
167c0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20 3c  .  }.  if( len <
167d0 20 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20   HOSTIDLEN ){.  
167e0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
167f0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d 65  time(&t);.    me
16800 6d 63 70 79 28 6b 65 79 2c 20 26 74 2c 20 73 69  mcpy(key, &t, si
16810 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 70 69  zeof(t));.    pi
16820 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
16830 20 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73 69    memcpy(&key[si
16840 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
16850 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
16860 7d 0a 20 20 0a 23 69 66 64 65 66 20 4d 41 4b 45  }.  .#ifdef MAKE
16870 5f 50 52 45 54 54 59 5f 48 4f 53 54 49 44 0a 20  _PRETTY_HOSTID. 
16880 20 2f 2a 20 66 69 6c 74 65 72 20 74 68 65 20 62   /* filter the b
16890 79 74 65 73 20 69 6e 74 6f 20 70 72 69 6e 74 61  ytes into printa
168a0 62 6c 65 20 61 73 63 69 69 20 63 68 61 72 61 63  ble ascii charac
168b0 74 65 72 73 20 61 6e 64 20 4e 55 4c 20 74 65 72  ters and NUL ter
168c0 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 6b 65 79 5b  minate */.  key[
168d0 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 5d 20 3d  (HOSTIDLEN-1)] =
168e0 20 30 78 30 30 3b 0a 20 20 66 6f 72 28 20 69 3d   0x00;.  for( i=
168f0 30 3b 20 69 3c 28 48 4f 53 54 49 44 4c 45 4e 2d  0; i<(HOSTIDLEN-
16900 31 29 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 75  1); i++ ){.    u
16910 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 20  nsigned char pa 
16920 3d 20 6b 65 79 5b 69 5d 26 30 78 37 46 3b 0a 20  = key[i]&0x7F;. 
16930 20 20 20 69 66 28 20 70 61 3c 30 78 32 30 20 29     if( pa<0x20 )
16940 7b 0a 20 20 20 20 20 20 6b 65 79 5b 69 5d 20 3d  {.      key[i] =
16950 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d 3d   (key[i]&0x80 ==
16960 20 30 78 38 30 29 20 3f 20 70 61 2b 30 78 34 30   0x80) ? pa+0x40
16970 20 3a 20 70 61 2b 30 78 32 30 3b 0a 20 20 20 20   : pa+0x20;.    
16980 7d 65 6c 73 65 20 69 66 28 20 70 61 3d 3d 30 78  }else if( pa==0x
16990 37 46 20 29 7b 0a 20 20 20 20 20 20 6b 65 79 5b  7F ){.      key[
169a0 69 5d 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38  i] = (key[i]&0x8
169b0 30 20 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 3d  0 == 0x80) ? pa=
169c0 30 78 32 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a  0x20 : pa+0x7E;.
169d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
169e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
169f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 77 72 69 74 65  _OK;.}../* write
16a00 73 20 74 68 65 20 68 6f 73 74 20 69 64 20 70 61  s the host id pa
16a10 74 68 20 74 6f 20 70 61 74 68 2c 20 70 61 74 68  th to path, path
16a20 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 70 72   should be an pr
16a30 65 2d 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  e-allocated buff
16a40 65 72 0a 2a 2a 20 77 69 74 68 20 65 6e 6f 75 67  er.** with enoug
16a50 68 20 73 70 61 63 65 20 66 6f 72 20 61 20 70 61  h space for a pa
16a60 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th .*/.static in
16a70 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
16a80 50 61 74 68 28 63 68 61 72 20 2a 70 61 74 68 2c  Path(char *path,
16a90 20 73 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20 20   size_t len){.  
16aa0 73 74 72 6c 63 70 79 28 70 61 74 68 2c 20 48 4f  strlcpy(path, HO
16ab0 53 54 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b 0a  STIDPATH, len);.
16ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16ad0 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
16ae0 5f 68 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29 7b  _hostid_num>0 ){
16af0 0a 20 20 20 20 63 68 61 72 20 73 75 66 66 69 78  .    char suffix
16b00 5b 32 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73  [2] = "1";.    s
16b10 75 66 66 69 78 5b 30 5d 20 3d 20 73 75 66 66 69  uffix[0] = suffi
16b20 78 5b 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f 68  x[0] + sqlite3_h
16b30 6f 73 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20 73  ostid_num;.    s
16b40 74 72 6c 63 61 74 28 70 61 74 68 2c 20 73 75 66  trlcat(path, suf
16b50 66 69 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a 23  fix, len);.  }.#
16b60 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33  endif.  OSTRACE3
16b70 28 22 47 45 54 48 4f 53 54 49 44 50 41 54 48 20  ("GETHOSTIDPATH 
16b80 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
16b90 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ath, getpid());.
16ba0 7d 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  }../* get the ho
16bb0 73 74 20 49 44 20 66 72 6f 6d 20 61 20 73 71 6c  st ID from a sql
16bc0 69 74 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  ite hostid file 
16bd0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 2a  stored in the .*
16be0 2a 20 75 73 65 72 2d 73 70 65 63 69 66 69 63 20  * user-specific 
16bf0 74 6d 70 20 64 69 72 65 63 74 6f 72 79 2c 20 63  tmp directory, c
16c00 72 65 61 74 65 20 74 68 65 20 49 44 20 69 66 20  reate the ID if 
16c10 69 74 27 73 20 6e 6f 74 20 74 68 65 72 65 20 61  it's not there a
16c20 6c 72 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74 69  lready .*/.stati
16c30 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
16c40 73 74 49 44 28 63 68 61 72 20 2a 70 48 6f 73 74  stID(char *pHost
16c50 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
16c60 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68  {.  int fd;.  ch
16c70 61 72 20 70 61 74 68 5b 4d 41 58 50 41 54 48 4c  ar path[MAXPATHL
16c80 45 4e 5d 3b 20 0a 20 20 73 69 7a 65 5f 74 20 6c  EN]; .  size_t l
16c90 65 6e 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c  en;.  int rc=SQL
16ca0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 78 79  ITE_OK;..  proxy
16cb0 47 65 74 48 6f 73 74 49 44 50 61 74 68 28 70 61  GetHostIDPath(pa
16cc0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
16cd0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
16ce0 61 74 65 20 74 68 65 20 68 6f 73 74 20 49 44 20  ate the host ID 
16cf0 66 69 6c 65 2c 20 69 66 20 69 74 20 61 6c 72 65  file, if it alre
16d00 61 64 79 20 65 78 69 73 74 73 20 72 65 61 64 20  ady exists read 
16d10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
16d20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68    fd = open(path
16d30 2c 20 4f 5f 43 52 45 41 54 7c 4f 5f 57 52 4f 4e  , O_CREAT|O_WRON
16d40 4c 59 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34 29  LY|O_EXCL, 0644)
16d50 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
16d60 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
16d70 6f 3b 0a 09 09 0a 20 20 20 20 69 66 28 20 65 72  o;....    if( er
16d80 72 21 3d 45 45 58 49 53 54 20 29 7b 0a 23 69 66  r!=EEXIST ){.#if
16d90 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
16da0 5f 44 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68  _DEBUG /* set th
16db0 65 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d  e sqlite error m
16dc0 65 73 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a  essage instead *
16dd0 2f 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  /.      fprintf(
16de0 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20  stderr, "sqlite 
16df0 65 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 68  error creating h
16e00 6f 73 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20  ost ID file %s: 
16e10 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
16e20 20 20 20 20 20 70 61 74 68 2c 20 73 74 72 65 72       path, strer
16e30 72 6f 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69  ror(err));.#endi
16e40 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  f.      return S
16e50 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
16e60 7d 0a 20 20 20 20 2f 2a 20 63 6f 75 6c 64 6e 27  }.    /* couldn'
16e70 74 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  t create the fil
16e80 65 2c 20 72 65 61 64 20 69 74 20 69 6e 73 74 65  e, read it inste
16e90 61 64 20 2a 2f 0a 20 20 20 20 66 64 20 3d 20 6f  ad */.    fd = o
16ea0 70 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e  pen(path, O_RDON
16eb0 4c 59 7c 4f 5f 45 58 43 4c 29 3b 0a 20 20 20 20  LY|O_EXCL);.    
16ec0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
16ed0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
16ee0 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  o;.#ifdef SQLITE
16ef0 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20  _PROXY_DEBUG /* 
16f00 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65  set the sqlite e
16f10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73  rror message ins
16f20 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66 70  tead */.      fp
16f30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
16f40 71 6c 69 74 65 20 65 72 72 6f 72 20 6f 70 65 6e  qlite error open
16f50 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65  ing host ID file
16f60 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %s: %s\n",.    
16f70 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20            path, 
16f80 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a  strerror(err));.
16f90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
16fa0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
16fb0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
16fc0 20 70 72 65 61 64 28 66 64 2c 20 70 48 6f 73 74   pread(fd, pHost
16fd0 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30  ID, HOSTIDLEN, 0
16fe0 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30  );.    if( len<0
16ff0 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
17000 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
17010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
17020 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c  RR_READ;.    }el
17030 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49  se if( len<HOSTI
17040 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70  DLEN ){.      *p
17050 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Error = 0;.     
17060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
17070 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
17080 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66     }.    close(f
17090 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
170a0 6c 65 61 6b 20 74 68 65 20 66 64 20 69 66 20 69  leak the fd if i
170b0 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f  t fails */.    O
170c0 53 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54  STRACE3("GETHOST
170d0 49 44 20 20 72 65 61 64 20 25 73 20 70 69 64 3d  ID  read %s pid=
170e0 25 64 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20  %d\n", pHostID, 
170f0 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72  getpid());.    r
17100 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73  eturn rc;.  }els
17110 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
17120 20 20 2f 2a 20 77 65 27 72 65 20 63 72 65 61 74    /* we're creat
17130 69 6e 67 20 74 68 65 20 68 6f 73 74 20 49 44 20  ing the host ID 
17140 66 69 6c 65 20 28 75 73 65 20 61 20 72 61 6e 64  file (use a rand
17150 6f 6d 20 73 74 72 69 6e 67 20 6f 66 20 62 79 74  om string of byt
17160 65 73 29 20 2a 2f 0a 20 20 20 20 70 72 6f 78 79  es) */.    proxy
17170 47 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28 70  GenerateHostID(p
17180 48 6f 73 74 49 44 29 3b 0a 20 20 20 20 6c 65 6e  HostID);.    len
17190 20 3d 20 70 77 72 69 74 65 28 66 64 2c 20 70 48   = pwrite(fd, pH
171a0 6f 73 74 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e  ostID, HOSTIDLEN
171b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  , 0);.    if( le
171c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  n<0 ){.      *pE
171d0 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rror = errno;.  
171e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
171f0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
17200 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48   }else if( len<H
17210 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20  OSTIDLEN ){.    
17220 20 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20    *pError = 0;. 
17230 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17240 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
17250 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64    }.    close(fd
17260 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
17270 65 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74  eak the fd if it
17280 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53   fails */.    OS
17290 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49  TRACE3("GETHOSTI
172a0 44 20 20 77 72 6f 74 65 20 25 73 20 70 69 64 3d  D  wrote %s pid=
172b0 25 64 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20  %d\n", pHostID, 
172c0 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72  getpid());.    r
172d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
172e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
172f0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
17300 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
17310 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
17320 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
17330 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
17340 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
17350 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
17360 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
17370 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
17380 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
17390 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
173a0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
173b0 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
173c0 20 63 68 61 72 20 75 74 64 69 72 5b 4d 41 58 50   char utdir[MAXP
173d0 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 0a 20 20  ATHLEN];.    .  
173e0 20 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41    confstr(_CS_DA
173f0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
17400 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
17410 6e 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74  n);.    len = st
17420 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
17430 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
17440 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 6d 6b  Len);.    if( mk
17450 64 69 72 28 6c 50 61 74 68 2c 20 53 51 4c 49 54  dir(lPath, SQLIT
17460 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
17470 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
17480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 6d  ){.      /* if m
17490 6b 64 69 72 20 66 61 69 6c 73 2c 20 68 61 6e 64  kdir fails, hand
174a0 6c 65 20 61 73 20 6c 6f 63 6b 20 66 69 6c 65 20  le as lock file 
174b0 63 72 65 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  creation failure
174c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
174d0 72 20 3d 20 65 72 72 6e 6f 3b 0a 23 20 20 69 66  r = errno;.#  if
174e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
174f0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d  .      if( err!=
17500 45 45 58 49 53 54 20 29 7b 0a 20 20 20 20 20 20  EEXIST ){.      
17510 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17520 2c 20 22 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  , "proxyGetLockP
17530 61 74 68 3a 20 6d 6b 64 69 72 28 25 73 2c 30 25  ath: mkdir(%s,0%
17540 6f 29 20 65 72 72 6f 72 20 25 64 20 25 73 5c 6e  o) error %d %s\n
17550 22 2c 20 6c 50 61 74 68 2c 0a 20 20 20 20 20 20  ", lPath,.      
17560 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17570 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
17580 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2c 20 65  R_PERMISSIONS, e
17590 72 72 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  rr, strerror(err
175a0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 20 20 65  ));.      }.#  e
175b0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
175c0 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22        OSTRACE3("
175d0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 6d 6b 64  GETLOCKPATH  mkd
175e0 69 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  ir %s pid=%d\n",
175f0 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28 29   lPath, getpid()
17600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  );.    }.    .  
17610 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
17620 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
17630 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
17640 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
17650 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
17660 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
17670 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
17680 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
17690 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
176a0 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
176b0 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
176c0 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
176d0 20 20 64 62 4c 65 6e 20 3d 20 73 74 72 6c 65 6e    dbLen = strlen
176e0 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
176f0 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
17700 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65   (i+len+7)<maxLe
17710 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
17720 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
17730 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
17740 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
17750 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
17760 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
17770 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
17780 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
17790 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
177a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
177b0 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
177c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
177d0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
177e0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
177f0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
17800 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
17810 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
17820 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
17830 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
17840 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
17850 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
17860 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
17870 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17880 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
17890 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
178a0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
178b0 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
178c0 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
178d0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
178e0 61 74 65 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73  ateUnixFile(cons
178f0 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e  t char *path, un
17900 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29  ixFile **ppFile)
17910 20 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69   {.  int fd;.  i
17920 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  nt dirfd = -1;. 
17930 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
17940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17950 54 45 5f 4f 4b 3b 0a 0a 20 20 66 64 20 3d 20 6f  TE_OK;..  fd = o
17960 70 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 57 52  pen(path, O_RDWR
17970 20 7c 20 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49   | O_CREAT, SQLI
17980 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
17990 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
179a0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
179b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
179c0 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 0a 20  NTOPEN;.  }.  . 
179d0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
179e0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
179f0 6f 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  oc(sizeof(unixFi
17a00 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  le));.  if( pNew
17a10 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
17a20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
17a30 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
17a40 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
17a50 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
17a60 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
17a70 65 29 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  e));.  .  rc = f
17a80 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 4e 55  illInUnixFile(NU
17a90 4c 4c 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28  LL, fd, dirfd, (
17aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
17ab0 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b  ew, path, 0, 0);
17ac0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
17ae0 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
17af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b00 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
17b10 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c  _proxy:    .  cl
17b20 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
17b30 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20  ntly leak fd if 
17b40 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61 6c 72  error, we're alr
17b50 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f  eady in error */
17b60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
17b70 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
17b80 72 63 3b 0a 7d 0a 0a 2f 2a 20 74 61 6b 65 73 20  rc;.}../* takes 
17b90 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
17ba0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
17bb0 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
17bc0 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
17bd0 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
17be0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
17bf0 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
17c00 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
17c10 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
17c20 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
17c30 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
17c40 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
17c50 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
17c60 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
17c70 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
17c80 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
17c90 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
17ca0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
17cb0 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
17cc0 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
17cd0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17ce0 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
17cf0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
17d00 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
17d10 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
17d20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
17d30 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
17d40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
17d50 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
17d60 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
17d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17d80 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
17d90 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
17da0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
17db0 63 68 46 69 6c 65 3b 0a 20 20 20 20 63 68 61 72  chFile;.    char
17dc0 20 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e 43 48   testValue[CONCH
17dd0 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 63  LEN];.    char c
17de0 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43 48 4c  onchValue[CONCHL
17df0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
17e00 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
17e10 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 4c  N];.    char *tL
17e20 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
17e30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
17e40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
17e50 72 65 61 64 52 63 20 3d 20 53 51 4c 49 54 45 5f  readRc = SQLITE_
17e60 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79 6e 63  OK;.    int sync
17e70 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20 20 20  Perms = 0;..    
17e80 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45 43 4f  OSTRACE4("TAKECO
17e90 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
17ea0 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
17eb0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
17ec0 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
17ed0 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
17ee0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
17ef0 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
17f00 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72 63 20  pid());..    rc 
17f10 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
17f20 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
17f30 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
17f40 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
17f50 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
17f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17f70 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
17f80 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
17f90 74 65 73 74 56 61 6c 75 65 2c 20 30 2c 20 43 4f  testValue, 0, CO
17fa0 4e 43 48 4c 45 4e 29 3b 20 2f 2f 20 63 6f 6e 63  NCHLEN); // conc
17fb0 68 20 69 73 20 66 69 78 65 64 20 73 69 7a 65 0a  h is fixed size.
17fc0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
17fd0 47 65 74 48 6f 73 74 49 44 28 74 65 73 74 56 61  GetHostID(testVa
17fe0 6c 75 65 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  lue, &pError);. 
17ff0 20 20 20 20 20 69 66 28 20 72 63 26 53 51 4c 49       if( rc&SQLI
18000 54 45 5f 49 4f 45 52 52 3d 3d 53 51 4c 49 54 45  TE_IOERR==SQLITE
18010 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
18020 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
18030 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
18040 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18050 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
18060 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  th ){.        st
18070 72 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65  rlcpy(&testValue
18080 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74  [HOSTIDLEN], pCt
18090 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
180a0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
180b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
180c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
180d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
180e0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
180f0 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72      }.    .    r
18100 65 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64  eadRc = unixRead
18110 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
18120 29 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63  )conchFile, conc
18130 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e  hValue, CONCHLEN
18140 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
18150 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  adRc!=SQLITE_IOE
18160 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
18170 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 74 63 68  .      int match
18180 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
18190 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 4f  readRc!=SQLITE_O
181a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
181b0 20 72 63 26 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc&SQLITE_IOERR
181c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
181d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
181e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63  e->lastErrno = c
181f0 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72  onchFile->lastEr
18200 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
18210 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
18220 52 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  Rc;.        goto
18230 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
18240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
18250 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61   if the conch ha
18260 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74  s data compare t
18270 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
18280 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
18290 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
182a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20  .        /* for 
182b0 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
182c0 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
182d0 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
182e0 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
182f0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
18300 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
18310 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
18320 65 61 64 79 20 69 6e 20 74 68 65 72 65 20 2a 2f  eady in there */
18330 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65  .        if( !me
18340 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20  mcmp(testValue, 
18350 63 6f 6e 63 68 56 61 6c 75 65 2c 20 48 4f 53 54  conchValue, HOST
18360 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
18370 20 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20      tLockPath = 
18380 28 63 68 61 72 20 2a 29 26 63 6f 6e 63 68 56 61  (char *)&conchVa
18390 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a  lue[HOSTIDLEN];.
183a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
183b0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
183c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
183d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
183e0 77 65 27 76 65 20 67 6f 74 20 74 68 65 20 63 6f  we've got the co
183f0 6e 63 68 20 69 66 20 63 6f 6e 63 68 56 61 6c 75  nch if conchValu
18400 65 20 6d 61 74 63 68 65 73 20 6f 75 72 20 70 61  e matches our pa
18410 74 68 20 61 6e 64 20 68 6f 73 74 20 49 44 20 2a  th and host ID *
18420 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d  /.        if( !m
18430 65 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c  emcmp(testValue,
18440 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e   conchValue, CON
18450 43 48 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  CHLEN) ){.      
18460 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
18470 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
18480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
18490 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  lse{.      /* a 
184a0 73 68 6f 72 74 20 72 65 61 64 20 6d 65 61 6e 73  short read means
184b0 20 77 65 27 72 65 20 22 63 72 65 61 74 69 6e 67   we're "creating
184c0 22 20 74 68 65 20 63 6f 6e 63 68 20 28 65 76 65  " the conch (eve
184d0 6e 20 74 68 6f 75 67 68 20 69 74 20 63 6f 75 6c  n though it coul
184e0 64 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  d .      ** have
184f0 20 62 65 65 6e 20 75 73 65 72 2d 69 6e 74 65 72   been user-inter
18500 76 65 6e 74 69 6f 6e 29 2c 20 69 66 20 77 65 20  vention), if we 
18510 61 63 71 75 69 72 65 20 74 68 65 20 65 78 63 6c  acquire the excl
18520 75 73 69 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20  usive lock,.    
18530 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
18540 6f 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72  o match the curr
18550 65 6e 74 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d  ent on-disk perm
18560 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
18570 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2f  atabase.      */
18580 0a 20 20 20 20 20 20 73 79 6e 63 50 65 72 6d 73  .      syncPerms
18590 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
185a0 0a 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 63  .    /* either c
185b0 6f 6e 63 68 20 77 61 73 20 65 6d 74 70 79 20 6f  onch was emtpy o
185c0 72 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 2a  r didn't match *
185d0 2f 0a 20 20 20 20 69 66 28 20 21 70 43 74 78 2d  /.    if( !pCtx-
185e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
185f0 7b 0a 20 20 20 20 20 20 70 72 6f 78 79 47 65 74  {.      proxyGet
18600 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64  LockPath(pCtx->d
18610 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c  bPath, lockPath,
18620 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
18630 20 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20      tLockPath = 
18640 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
18650 73 74 72 6c 63 70 79 28 26 74 65 73 74 56 61 6c  strlcpy(&testVal
18660 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 6c  ue[HOSTIDLEN], l
18670 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
18680 4c 45 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LEN);.    }.    
18690 0a 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63  .    /* update c
186a0 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61  onch with host a
186b0 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69  nd path (this wi
186c0 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72  ll fail if other
186d0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 2a 2a   process.     **
186e0 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
186f0 63 6b 20 61 6c 72 65 61 64 79 29 20 2a 2f 0a 20  ck already) */. 
18700 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
18710 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
18720 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
18730 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
18740 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
18750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18770 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69   unixWrite((sqli
18780 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68  te3_file *)conch
18790 46 69 6c 65 2c 20 74 65 73 74 56 61 6c 75 65 2c  File, testValue,
187a0 20 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20   CONCHLEN, 0);. 
187b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
187c0 49 54 45 5f 4f 4b 20 26 26 20 73 79 6e 63 50 65  ITE_OK && syncPe
187d0 72 6d 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rms ){.        s
187e0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
187f0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
18800 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  = fstat(pFile->h
18810 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
18820 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20   if( err==0 ){. 
18830 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20           mode_t 
18840 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f  mode = buf.st_mo
18850 64 65 20 26 20 30 31 30 30 36 36 36 3b 0a 20 20  de & 0100666;.  
18860 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
18870 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
18880 62 61 73 65 20 66 69 6c 65 20 70 65 72 6d 69 73  base file permis
18890 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
188a0 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
188b0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
188c0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 66 63  BUG.          fc
188d0 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
188e0 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b  h, buf.st_mode);
188f0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
18900 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63   if( fchmod(conc
18910 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  hFile->h, buf.st
18920 5f 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20  _mode)!=0 ){.   
18930 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
18940 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
18950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
18960 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
18970 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
18980 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 20 20 20 20 20 62 75 66 2e 73 74 5f 6d 6f 64 65       buf.st_mode
189b0 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
189c0 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20  (code));.       
189d0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
189e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
189f0 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
18a00 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 62  %o SUCCEDED\n",b
18a10 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20  uf.st_mode);.   
18a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18a40 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
18a50 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  no;.          fp
18a60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
18a70 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
18a80 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f           err, co
18ab0 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
18ac0 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e));.#endif.    
18ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18ae0 20 20 7d 0a 20 20 20 20 63 6f 6e 63 68 46 69 6c    }.    conchFil
18af0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
18b00 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
18b10 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
18b20 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65  ARED_LOCK);.  .e
18b30 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20  nd_takeconch:.  
18b40 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e    OSTRACE2("TRAN
18b50 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
18b60 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
18b70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18b80 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
18b90 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20  >openFlags ){.  
18ba0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68      if( pFile->h
18bb0 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54  >=0 ){.#ifdef ST
18bc0 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52  RICT_CLOSE_ERROR
18bd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f  .        if( clo
18be0 73 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a  se(pFile->h) ){.
18bf0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18c00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
18c10 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
18c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18c30 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20  R_CLOSE;.       
18c40 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
18c50 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29   close(pFile->h)
18c60 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
18c70 61 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f  ak fd if fail */
18c80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
18c90 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
18ca0 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 66   -1;.      int f
18cb0 64 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64  d = open(pCtx->d
18cc0 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70  bPath, pFile->op
18cd0 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18cf0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
18d00 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
18d10 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 54       OSTRACE2("T
18d20 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20  RANSPROXY: OPEN 
18d30 20 25 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20   %d\n", fd);.   
18d40 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
18d50 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18d60 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 7d 65 6c   = fd;.      }el
18d70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 3d 53  se{.        rc=S
18d80 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
18d90 2f 2f 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  // SQLITE_BUSY? 
18da0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
18db0 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 6c 6f 63  alled during loc
18dc0 6b 69 6e 67 0a 20 20 20 20 20 20 7d 0a 20 20 20  king.      }.   
18dd0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18de0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
18df0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
18e00 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
18e10 20 3d 20 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74   = tLockPath ? t
18e20 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
18e30 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
18e40 20 20 20 20 20 20 2f 2f 20 41 43 53 3a 20 4e 65        // ACS: Ne
18e50 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
18e60 79 20 6f 66 20 70 61 74 68 20 73 6f 6d 65 74 69  y of path someti
18e70 6d 65 73 0a 20 20 20 20 20 20 72 63 20 3d 20 70  mes.      rc = p
18e80 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
18e90 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
18ea0 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
18eb0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
18ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ed0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
18ee0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 1;..      if(
18ef0 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20   tLockPath ){.  
18f00 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
18f10 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
18f20 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74  te3DbStrDup(0, t
18f30 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
18f40 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
18f50 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
18f60 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
18f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 28   ){.          ((
18f80 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
18f90 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
18fa0 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
18fb0 65 78 74 29 2d 3e 64 62 50 61 74 68 20 3d 0a 20  ext)->dbPath =. 
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
18fe0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
18ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19000 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 63 6f   else {.      co
19010 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
19020 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
19030 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
19040 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
19050 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 33    }.    OSTRACE3
19060 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
19070 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
19080 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->h, rc==SQLITE_
19090 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22  OK?"ok":"failed"
190a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
190b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
190c0 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
190d0 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
190e0 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
190f0 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
19100 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
19110 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
19120 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
19130 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19150 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
19160 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
19170 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
19180 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
19190 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
191a0 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
191b0 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
191c0 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
191d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
191e0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
191f0 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
19200 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
19210 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
19220 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
19230 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
19240 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
19250 45 34 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E4("RELEASECONCH
19260 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
19270 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
19280 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
19290 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
192a0 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
192b0 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
192c0 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
192d0 20 20 20 20 67 65 74 70 69 64 28 29 29 3b 0a 20      getpid());. 
192e0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
192f0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 63 6f 6e   = 0;.  rc = con
19300 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
19310 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
19320 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
19330 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 4f  e, NO_LOCK);.  O
19340 53 54 52 41 43 45 33 28 22 52 45 4c 45 41 53 45  STRACE3("RELEASE
19350 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
19360 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
19370 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
19380 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
19390 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
193a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
193b0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
193c0 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
193d0 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
193e0 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
193f0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
19400 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
19410 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
19420 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
19430 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
19440 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
19450 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
19460 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
19470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
19480 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
19490 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
194a0 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
194b0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
194c0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
194d0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
194e0 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
194f0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
19500 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
19510 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
19520 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
19530 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
19540 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
19550 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
19560 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19570 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
19580 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
19590 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
195a0 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
195b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
195c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
195d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
195e0 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
195f0 6e 28 64 62 50 61 74 68 29 3b 20 20 20 20 20 2f  n(dbPath);     /
19600 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61  * Length of data
19610 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20  base filename - 
19620 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72  dbPath */.  char
19630 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20   *conchPath;    
19640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66            /* buf
19650 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
19660 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20  construct conch 
19670 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  name */..  /* Al
19680 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19690 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
196a0 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ame and initiali
196b0 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20  ze the name to. 
196c0 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   ** the name of 
196d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
196e0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20  abase file. */  
196f0 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d  .  *pConchPath =
19700 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68   conchPath = (ch
19710 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
19720 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20  loc(len + 8);.  
19730 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30  if( conchPath==0
19740 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19750 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
19760 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50  .  memcpy(conchP
19770 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e  ath, dbPath, len
19780 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77  +1);.  .  /* now
19790 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65   insert a "." be
197a0 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20  fore the last / 
197b0 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66  character */.  f
197c0 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69  or( i=(len-1); i
197d0 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20  >=0; i-- ){.    
197e0 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  if( conchPath[i]
197f0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
19800 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
19810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e  .    }.  }.  con
19820 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20  chPath[i]='.';. 
19830 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29   while ( i<len )
19840 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b  {.    conchPath[
19850 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a  i+1]=dbPath[i];.
19860 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
19870 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d  /* append the "-
19880 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f  conch" suffix to
19890 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d   the file */.  m
198a0 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68  emcpy(&conchPath
198b0 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c  [i+1], "-conch",
198c0 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   7);.  assert( s
198d0 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
198e0 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
198f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19900 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
19910 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
19920 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
19930 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
19940 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
19950 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
19960 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
19970 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
19980 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
19990 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
199a0 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
199b0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
199c0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
199d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
199e0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
199f0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
19a00 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
19a10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
19a20 68 3b 0a 20 20 69 6e 74 20 74 61 6b 65 6e 20 3d  h;.  int taken =
19a30 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
19a40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
19a50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
19a60 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
19a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
19a80 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
19a90 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
19aa0 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
19ab0 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
19ac0 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
19ad0 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
19ae0 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
19af0 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
19b00 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
19b10 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
19b20 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
19b30 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
19b40 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
19b50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19b60 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
19b70 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
19b80 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
19b90 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
19ba0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
19bb0 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
19bc0 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
19bd0 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
19be0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
19bf0 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
19c00 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
19c10 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
19c20 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
19c30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
19c50 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
19c60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19c70 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
19c80 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
19c90 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
19ca0 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
19cb0 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
19cc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19cd0 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
19ce0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
19cf0 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
19d00 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
19d10 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
19d20 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
19d30 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
19d40 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
19d50 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
19d60 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
19d70 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
19d80 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
19d90 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
19da0 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
19db0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
19dc0 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
19dd0 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
19de0 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
19df0 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
19e00 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20 69  (__DARWIN__).  i
19e10 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
19e20 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
19e30 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70  ds ){.    /* afp
19e40 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72   style keeps a r
19e50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
19e60 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66  db path in the f
19e70 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20  ilePath field . 
19e80 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72     ** of the str
19e90 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  uct */.    asser
19ea0 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  t( strlen((char*
19eb0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
19ec0 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
19ed0 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 63 70  LEN );.    strcp
19ee0 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c  y(dbPath, ((afpL
19ef0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
19f00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
19f10 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 29 0a  ntext)->dbPath).
19f20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
19f30 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
19f40 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  hod == &dotlockI
19f50 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
19f60 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c  /* dot lock styl
19f70 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  e uses the locki
19f80 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
19f90 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b  ore the dot lock
19fa0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74  .    ** file pat
19fb0 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  h */.    int len
19fc0 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20   = strlen((char 
19fd0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
19fe0 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65  Context) - strle
19ff0 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  n(DOTLOCK_SUFFIX
1a000 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  );.    memcpy(db
1a010 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
1a020 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1a030 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20  ext, len + 1);. 
1a040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61   }else{.    /* a
1a050 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20  ll other styles 
1a060 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  use the locking 
1a070 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
1a080 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74   the db file pat
1a090 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  h */.    assert(
1a0a0 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70   strlen((char*)p
1a0b0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1a0c0 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
1a0d0 4e 20 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28  N );.    strcpy(
1a0e0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
1a0f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1a100 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65  ntext);.  }.  re
1a110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a120 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61  }../*.** Takes a
1a130 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64  n already filled
1a140 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e   in unix file an
1a150 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61  d alters it so a
1a160 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ll file locking 
1a170 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66  .** will be perf
1a180 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63  ormed on the loc
1a190 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  al proxy lock fi
1a1a0 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le.  The followi
1a1b0 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65  ng fields.** are
1a1c0 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68   preserved in th
1a1d0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
1a1e0 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  t so that they c
1a1f0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  an be restored a
1a200 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20  nd .** the unix 
1a210 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72  structure proper
1a220 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74  ly cleaned up at
1a230 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20   close time:.** 
1a240 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78   ->lockingContex
1a250 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a  t.**  ->pMethod.
1a260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
1a270 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 46  ansformUnixFileF
1a280 6f 72 4c 6f 63 6b 50 72 6f 78 79 28 75 6e 69 78  orLockProxy(unix
1a290 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
1a2a0 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
1a2b0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
1a2c0 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
1a2d0 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50  char dbPath[MAXP
1a2e0 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20  ATHLEN+1];      
1a2f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1a300 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1a310 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  .  char *lockPat
1a320 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63  h=NULL;.  int rc
1a330 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a340 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
1a350 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
1a360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a370 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
1a380 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
1a390 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  orUnixFile(pFile
1a3a0 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28  , dbPath);.  if(
1a3b0 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
1a3c0 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
1a3d0 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
1a3e0 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  ") ){.    lockPa
1a3f0 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  th=NULL;.  }else
1a400 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28  {.    lockPath=(
1a410 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d  char *)path;.  }
1a420 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22  .  .  OSTRACE4("
1a430 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66  TRANSPROXY  %d f
1a440 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
1a450 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
1a460 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20        (lockPath 
1a470 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61  ? lockPath : ":a
1a480 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
1a490 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c  );..  pCtx = sql
1a4a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1a4b0 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
1a4c0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
1a4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a4e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
1a4f0 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69  mset(pCtx, 0, si
1a500 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20  zeof(*pCtx));.. 
1a510 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
1a520 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64  eConchPathname(d
1a530 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  bPath, &pCtx->co
1a540 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
1a550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a560 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
1a570 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
1a580 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
1a590 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  ePath, &pCtx->co
1a5a0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 7d 20 20 0a  nchFile);.  }  .
1a5b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a5c0 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20  _OK && lockPath 
1a5d0 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  ){.    pCtx->loc
1a5e0 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
1a5f0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
1a600 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  lockPath);.  }..
1a610 65 6e 64 5f 74 72 61 6e 73 66 6f 72 6d 5f 66 69  end_transform_fi
1a620 6c 65 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  le:.  if( rc==SQ
1a630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
1a640 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20  * all memory is 
1a650 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79  allocated, proxy
1a660 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e  s are created an
1a670 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20  d assigned, .   
1a680 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c   ** switch the l
1a690 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
1a6a0 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
1a6b0 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20  return..    */. 
1a6c0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
1a6d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1a6e0 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
1a6f0 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69    pCtx->oldLocki
1a700 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c  ngContext = pFil
1a710 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
1a720 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  t;.    pFile->lo
1a730 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
1a740 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70  Ctx;.    pCtx->p
1a750 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c  OldMethod = pFil
1a760 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20  e->pMethod;.    
1a770 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
1a780 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
1a790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a7a0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  f( pCtx->conchFi
1a7b0 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  le ){ .      rc 
1a7c0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
1a7d0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
1a7e0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
1a7f0 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   *)pCtx->conchFi
1a800 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
1a810 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1a820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a830 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
1a840 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1a850 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
1a860 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
1a870 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
1a880 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
1a890 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50  OSTRACE3("TRANSP
1a8a0 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
1a8b0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
1a8c0 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
1a8d0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
1a8e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
1a8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
1a900 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73  ithin this divis
1a910 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e  ion (the proxyin
1a920 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  g locking implem
1a930 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72  entation) the pr
1a940 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76  ocedures.** abov
1a950 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65  e this point are
1a960 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20   all utilities. 
1a970 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65   The lock-relate
1a980 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  d methods of the
1a990 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  .** proxy-lockin
1a9a0 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  g sqlite3_io_met
1a9b0 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f  hod object follo
1a9c0 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  w..*/.../*.** Th
1a9d0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
1a9e0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
1a9f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
1aa00 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
1aa10 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
1aa20 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
1aa30 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
1aa40 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
1aa50 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
1aa60 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
1aa70 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
1aa80 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
1aa90 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
1aaa0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
1aab0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
1aac0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
1aad0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
1aae0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
1aaf0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1ab00 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
1ab10 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1ab20 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
1ab30 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78  ResOut) {.  unix
1ab40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1ab50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1ab60 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
1ab70 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
1ab80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ab90 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
1aba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
1abb0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
1abc0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
1abd0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
1abe0 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
1abf0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
1ac00 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72  lockProxy;.    r
1ac10 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
1ac20 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
1ac30 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
1ac40 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
1ac50 52 65 73 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  ResOut);.  }.  r
1ac60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ac70 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
1ac80 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
1ac90 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
1aca0 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
1acb0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
1acc0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1acd0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
1ace0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
1acf0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
1ad00 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
1ad10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
1ad20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
1ad30 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
1ad40 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
1ad50 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
1ad60 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
1ad70 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
1ad80 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
1ad90 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
1ada0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
1adb0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
1adc0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
1add0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
1ade0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
1adf0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
1ae00 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
1ae10 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
1ae20 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
1ae30 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
1ae40 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
1ae50 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
1ae60 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
1ae70 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
1ae80 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
1ae90 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
1aea0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
1aeb0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
1aec0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
1aed0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
1aee0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
1aef0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
1af00 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
1af10 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
1af20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1af30 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
1af40 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
1af50 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
1af60 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
1af70 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
1af80 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
1af90 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1afa0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1afb0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
1afc0 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
1afd0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1afe0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
1aff0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
1b000 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
1b010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b020 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
1b030 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
1b040 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
1b050 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
1b060 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
1b070 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
1b080 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
1b090 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d  kProxy;.    rc =
1b0a0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
1b0b0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
1b0c0 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63  file*)proxy, loc
1b0d0 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c  ktype);.    pFil
1b0e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72  e->locktype = pr
1b0f0 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  oxy->locktype;. 
1b100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b110 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
1b120 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1b130 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
1b140 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
1b150 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
1b160 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
1b170 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
1b180 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
1b190 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
1b1a0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
1b1b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1b1c0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
1b1d0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
1b1e0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1b1f0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1b200 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1b210 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1b220 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
1b230 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
1b240 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
1b250 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1b260 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1b270 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
1b280 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
1b290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b2a0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
1b2b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
1b2c0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
1b2d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
1b2e0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
1b2f0 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
1b300 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
1b310 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72  lockProxy;.    r
1b320 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
1b330 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
1b340 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
1b350 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
1b360 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1b370 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79   = proxy->lockty
1b380 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pe;.  }.  return
1b390 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1b3a0 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20  ose a file that 
1b3b0 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73  uses proxy locks
1b3c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b3d0 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
1b3e0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
1b3f0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
1b400 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b410 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1b420 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
1b430 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
1b440 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
1b450 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
1b460 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
1b470 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
1b480 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
1b490 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69  ckProxy;.    uni
1b4a0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
1b4b0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
1b4c0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  le;.    int rc =
1b4d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b4e0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
1b4f0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
1b500 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
1b510 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
1b520 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
1b530 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Proxy, NO_LOCK);
1b540 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1b550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b560 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d   rc = lockProxy-
1b570 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
1b580 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
1b590 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
1b5a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b5b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
1b5c0 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
1b5d0 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  xy);.      pCtx-
1b5e0 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a  >lockProxy = 0;.
1b5f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f      }.    if( co
1b600 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  nchFile ){.     
1b610 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
1b620 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  Held ){.        
1b630 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73  rc = proxyReleas
1b640 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
1b650 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1b660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b670 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f   }.      rc = co
1b680 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
1b690 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
1b6a0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
1b6b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1b6c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b6d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b6e0 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  (conchFile);.   
1b6f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1b700 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  ree(pCtx->lockPr
1b710 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
1b720 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
1b730 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
1b740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b750 65 28 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b  e(pCtx->dbPath);
1b760 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20  .    /* restore 
1b770 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63  the original loc
1b780 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
1b790 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c   pMethod then cl
1b7a0 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46  ose it */.    pF
1b7b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1b7c0 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c  ext = pCtx->oldL
1b7d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
1b7e0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
1b7f0 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65  d = pCtx->pOldMe
1b800 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  thod;.    sqlite
1b810 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
1b820 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
1b830 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
1b840 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
1b850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b860 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
1b870 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20  ned(__DARWIN__) 
1b880 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1b890 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1b8a0 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  /./*.** The prox
1b8b0 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  y locking style 
1b8c0 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
1b8d0 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69 6c  use with AFP fil
1b8e0 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64  esystems..** And
1b8f0 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e   since AFP is on
1b900 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
1b910 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78  MacOSX, the prox
1b920 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73  y locking is als
1b930 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20  o.** restricted 
1b940 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a  to MacOSX..** .*
1b950 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1b960 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1b970 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c   proxy lock impl
1b980 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1b990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1b9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b9f0 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
1ba00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba40 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1ba50 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
1ba60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1ba70 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
1ba80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba90 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
1baa0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
1bab0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
1bac0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
1bad0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
1bae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
1baf0 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
1bb00 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
1bb10 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
1bb20 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
1bb30 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
1bb40 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
1bb50 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1bb60 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
1bb70 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
1bb80 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
1bb90 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
1bba0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
1bbb0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
1bbc0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
1bbd0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
1bbe0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
1bbf0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1bc00 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
1bc10 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
1bc20 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
1bc30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1bc40 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1bc50 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
1bc60 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
1bc70 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
1bc80 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
1bc90 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
1bca0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1bcb0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
1bcc0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
1bcd0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
1bce0 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
1bcf0 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
1bd00 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
1bd10 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
1bd20 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e  _PREAD.** any an
1bd30 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
1bd40 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
1bd50 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
1bd60 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
1bd70 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
1bd80 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
1bd90 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1bda0 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1bdb0 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1bdc0 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
1bdd0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1bde0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1bdf0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1be00 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
1be10 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
1be20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1be30 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
1be40 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1be50 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65  nt got;.  i64 ne
1be60 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52  wOffset;.  TIMER
1be70 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
1be80 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1be90 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d   got = pread(id-
1bea0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1beb0 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
1bec0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
1bed0 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
1bee0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1bef0 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36  ).  got = pread6
1bf00 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1bf10 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53  nt, offset);.  S
1bf20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1bf30 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
1bf40 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  e.  newOffset = 
1bf50 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
1bf60 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
1bf70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bf80 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
1bf90 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
1bfa0 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
1bfb0 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
1bfc0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
1bfd0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1bfe0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1bff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c000 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1c010 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1c020 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
1c030 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
1c040 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e   got = read(id->
1c050 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
1c060 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
1c070 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
1c080 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1c090 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1c0a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
1c0b0 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20  OSTRACE5("READ  
1c0c0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1c0d0 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
1c0e0 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
1c0f0 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
1c100 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f  return got;.}../
1c110 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1c120 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
1c130 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
1c140 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
1c150 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
1c160 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
1c170 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
1c180 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
1c190 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
1c1a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c1b0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
1c1c0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
1c1d0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1c1e0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1c1f0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
1c200 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73    int got;.  ass
1c210 65 72 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74  ert( id );.  got
1c220 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
1c230 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66  unixFile*)id, of
1c240 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1c250 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1c260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1c280 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1c290 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1c2a0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1c2b0 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1c2c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1c2d0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1c2e0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1c2f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
1c300 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1c310 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
1c320 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
1c330 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
1c340 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
1c350 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
1c360 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
1c370 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
1c380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c390 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1c3a0 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
1c3b0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1c3c0 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
1c3d0 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
1c3e0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1c3f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1c400 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1c410 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
1c420 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
1c430 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1c440 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
1c450 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
1c460 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
1c470 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1c480 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1c490 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1c4a0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1c4b0 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
1c4c0 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
1c4d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1c4e0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1c4f0 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65  nt got;.  i64 ne
1c500 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52  wOffset;.  TIMER
1c510 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
1c520 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1c530 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64   got = pwrite(id
1c540 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
1c550 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64  offset);.#elif d
1c560 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1c570 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69  64).  got = pwri
1c580 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  te64(id->h, pBuf
1c590 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
1c5a0 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65  #else.  newOffse
1c5b0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1c5c0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1c5d0 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66  T);.  if( newOff
1c5e0 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
1c5f0 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
1c600 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
1c610 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1c620 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1c630 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  no;.    }else{. 
1c640 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1c650 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1c660 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20  = 0;....    }.  
1c670 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1c680 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69  .  got = write(i
1c690 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
1c6a0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
1c6b0 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
1c6c0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
1c6d0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1c6e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
1c6f0 0a 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57 52  ..  OSTRACE5("WR
1c700 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1c710 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
1c720 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
1c730 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
1c740 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
1c750 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
1c760 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1c770 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
1c780 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1c790 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
1c7a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1c7b0 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
1c7c0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1c7d0 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
1c7e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c7f0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1c800 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1c810 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1c820 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
1c830 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
1c840 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1c850 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1c860 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ;.  while( amt>0
1c870 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1c880 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46  kAndWrite((unixF
1c890 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c  ile*)id, offset,
1c8a0 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1c8b0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1c8c0 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1c8d0 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1c8e0 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1c8f0 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1c900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c910 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1c920 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1c930 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1c940 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1c950 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e  1 ));.  if( amt>
1c960 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
1c970 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  te<0 ){.      /*
1c980 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
1c990 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1c9a0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1c9b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1c9c0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1c9d0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1c9e0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1c9f0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
1ca00 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1ca10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ca20 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1ca30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ca40 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1ca50 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1ca60 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1ca70 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1ca80 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1ca90 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1caa0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1cab0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1cac0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1cad0 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1cae0 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1caf0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1cb00 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1cb10 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1cb20 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1cb30 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61 73  * Use the fdatas
1cb40 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69  ync() API only i
1cb50 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54 41  f the HAVE_FDATA
1cb60 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1cb70 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  fined..** Otherw
1cb80 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29 20  ise use fsync() 
1cb90 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f  in its place..*/
1cba0 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44  .#ifndef HAVE_FD
1cbb0 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  ATASYNC.# define
1cbc0 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
1cbd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1cbe0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1cbf0 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
1cc00 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1cc10 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
1cc20 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
1cc30 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
1cc40 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
1cc50 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
1cc60 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
1cc70 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
1cc80 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
1cc90 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
1cca0 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
1ccb0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
1ccc0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1ccd0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
1cce0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1ccf0 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
1cd00 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
1cd10 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
1cd20 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
1cd30 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
1cd40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
1cd50 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
1cd60 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
1cd70 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
1cd80 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1cd90 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
1cda0 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
1cdb0 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
1cdc0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
1cdd0 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
1cde0 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
1cdf0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
1ce00 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
1ce10 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
1ce20 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
1ce30 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
1ce40 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
1ce50 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
1ce60 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
1ce70 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
1ce80 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
1ce90 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
1cea0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
1ceb0 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
1cec0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1ced0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1cee0 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1cef0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1cf00 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1cf10 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1cf20 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1cf30 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1cf40 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1cf50 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1cf60 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1cf70 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1cf80 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1cf90 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1cfa0 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1cfb0 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1cfc0 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1cfd0 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1cfe0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1cff0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d000 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1d010 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1d020 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1d030 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1d040 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1d050 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1d060 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1d070 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1d080 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d090 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 23 65 6e 64  (fullSync);.#end
1d0a0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1d0b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1d0c0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1d0d0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1d0e0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1d0f0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1d100 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1d110 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1d120 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1d130 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1d140 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1d150 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1d160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1d170 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1d180 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1d190 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1d1a0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1d1b0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1d1c0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1d1d0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1d1e0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1d1f0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1d200 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
1d210 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d220 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
1d230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
1d240 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1d250 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1d260 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
1d270 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1d280 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1d290 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1d2a0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1d2b0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1d2c0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1d2d0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1d2e0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1d2f0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1d300 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1d310 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1d320 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1d330 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1d340 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1d350 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1d360 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1d370 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1d380 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1d390 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1d3a0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1d3b0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1d3c0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1d3d0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1d3e0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1d3f0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1d400 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1d410 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1d420 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1d430 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1d440 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1d450 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1d460 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1d470 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a  nc(fd);..#else .
1d480 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29    if( dataOnly )
1d490 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61  {.    rc = fdata
1d4a0 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69 66  sync(fd);.    if
1d4b0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1d4c0 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
1d4d0 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
1d4e0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d4f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1d500 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1d510 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1d520 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1d530 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1d540 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1d550 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1d560 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1d570 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1d580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d590 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
1d5a0 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
1d5b0 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
1d5c0 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
1d5d0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
1d5e0 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
1d5f0 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
1d600 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
1d610 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
1d620 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
1d630 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
1d640 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
1d650 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
1d660 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
1d670 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
1d680 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
1d690 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1d6a0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1d6b0 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
1d6c0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
1d6d0 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
1d6e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1d6f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1d700 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
1d710 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
1d720 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
1d730 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
1d740 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
1d750 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1d760 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
1d770 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
1d780 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
1d790 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
1d7a0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1d7b0 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
1d7c0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
1d7d0 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
1d7e0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1d7f0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1d800 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
1d810 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
1d820 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1d830 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
1d840 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
1d850 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
1d860 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
1d870 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d880 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
1d890 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
1d8a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
1d8b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1d8c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1d8d0 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
1d8e0 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
1d8f0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
1d900 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
1d910 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
1d920 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1d930 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
1d940 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
1d950 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
1d960 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
1d970 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
1d980 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1d990 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
1d9a0 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1d9b0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1d9c0 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
1d9d0 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
1d9e0 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
1d9f0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1da00 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
1da10 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
1da20 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
1da30 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
1da40 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
1da50 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
1da60 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1da70 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1da80 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
1da90 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1daa0 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43    OSTRACE2("SYNC
1dab0 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
1dac0 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66  le->h);.  rc = f
1dad0 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1dae0 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1daf0 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1db00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1db10 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1db20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1db30 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1db40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1db50 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b  ITE_IOERR_FSYNC;
1db60 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
1db70 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ->dirfd>=0 ){.  
1db80 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f    int err;.    O
1db90 53 54 52 41 43 45 34 28 22 44 49 52 53 59 4e 43  STRACE4("DIRSYNC
1dba0 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c   %-3d (have_full
1dbb0 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e  fsync=%d fullsyn
1dbc0 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  c=%d)\n", pFile-
1dbd0 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20  >dirfd,.        
1dbe0 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59      HAVE_FULLFSY
1dbf0 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b  NC, isFullsync);
1dc00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dc10 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
1dc20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
1dc30 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c  tory sync is onl
1dc40 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66  y attempted if f
1dc50 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20  ull_fsync is.   
1dc60 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   ** turned off o
1dc70 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  r unavailable.  
1dc80 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20  If a full_fsync 
1dc90 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a  occurred above,.
1dca0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1dcb0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1dcc0 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20  s superfluous.. 
1dcd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
1dce0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c  HAVE_FULLFSYNC |
1dcf0 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26  | !isFullsync) &
1dd00 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  & full_fsync(pFi
1dd10 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29  le->dirfd,0,0) )
1dd20 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  {.       /*.    
1dd30 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65     ** We have re
1dd40 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
1dd50 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63  reports of fsync
1dd60 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  () returning.   
1dd70 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68      ** errors wh
1dd80 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69  en applied to di
1dd90 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72  rectories on cer
1dda0 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d  tain file system
1ddb0 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66  s..       ** A f
1ddc0 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20  ailed directory 
1ddd0 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69  sync is not a bi
1dde0 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73  g deal.  So it s
1ddf0 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62  eems.       ** b
1de00 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  etter to ignore 
1de10 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b  the error.  Tick
1de20 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20  et #1657.       
1de30 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69  */.       /* pFi
1de40 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1de50 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20  errno; */.      
1de60 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
1de70 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
1de80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72  }.#endif.    err
1de90 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
1dea0 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20  dirfd); /* Only 
1deb0 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
1dec0 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
1ded0 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d  */.    if( err==
1dee0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1def0 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77    /* directory w
1df00 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20  hen we are done 
1df10 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
1df20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20  dirfd = -1;.    
1df30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1df40 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1df50 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
1df60 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
1df70 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a  IR_CLOSE;.    }.
1df80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1df90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1dfa0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1dfb0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1dfc0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1dfd0 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1dfe0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1dff0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
1e000 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1e010 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74   id );.  Simulat
1e020 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1e030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
1e040 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d  UNCATE );.  rc =
1e050 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69   ftruncate(((uni
1e060 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  xFile*)id)->h, (
1e070 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
1e080 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 28 28  if( rc ){.    ((
1e090 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1e0a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e0b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1e0c0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1e0d0 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
1e0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e0f0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1e100 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1e110 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1e120 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1e130 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e140 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1e150 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1e160 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1e170 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1e180 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1e190 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  d );.  rc = fsta
1e1a0 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1e1b0 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1e1c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e1d0 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1e1e0 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1e1f0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1e200 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1e210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e220 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1e230 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1e240 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1e250 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1e260 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1e270 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49  e, the findLockI
1e280 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1e290 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1e2a0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1e2b0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1e2c0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1e2d0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1e2e0 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1e2f0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1e300 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1e310 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1e320 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1e330 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1e340 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1e350 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1e360 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1e370 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1e380 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1e390 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1e3a0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1e3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e3c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  .}.../*.** Infor
1e3d0 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1e3e0 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1e3f0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1e400 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1e410 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e420 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1e430 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1e440 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e450 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e460 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1e470 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1e480 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1e490 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
1e4a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e4b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e4c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e4d0 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
1e4e0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1e4f0 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
1e500 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  )->lastErrno;.  
1e510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e520 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  E_OK;.    }.#if 
1e530 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e540 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1e550 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
1e560 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1e570 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1e580 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
1e590 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1e5a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1e5b0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1e5c0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
1e5d0 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
1e5e0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
1e5f0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
1e600 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
1e610 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
1e620 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
1e630 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
1e640 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
1e650 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
1e660 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
1e670 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
1e680 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
1e690 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
1e6a0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
1e6b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e6c0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
1e6d0 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
1e6e0 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
1e6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
1e700 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
1e710 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
1e720 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
1e730 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1e740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e750 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e760 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1e770 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
1e780 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1e790 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
1e7a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e7b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
1e7c0 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
1e7d0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
1e7e0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
1e7f0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
1e800 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
1e810 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
1e820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1e830 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
1e840 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
1e850 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
1e860 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
1e870 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
1e880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1e890 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
1e8a0 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
1e8b0 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
1e8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e8d0 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
1e8e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
1e8f0 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
1e900 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1e910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1e930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
1e940 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
1e950 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
1e960 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
1e970 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
1e980 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
1e990 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
1e9a0 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
1e9b0 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
1e9c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
1e9d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1e9e0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
1e9f0 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
1ea00 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
1ea10 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
1ea20 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
1ea30 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1ea40 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
1ea50 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
1ea60 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
1ea70 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
1ea80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ea90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eaa0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1eab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1eac0 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
1ead0 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
1eae0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
1eaf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1eb00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1eb10 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
1eb20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
1eb30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72           rc = tr
1eb40 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 46  ansformUnixFileF
1eb50 6f 72 4c 6f 63 6b 50 72 6f 78 79 28 70 46 69 6c  orLockProxy(pFil
1eb60 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
1eb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eb80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1eb90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1eba0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ebb0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ebc0 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
1ebd0 4e 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  N__) */.  }.  re
1ebe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1ebf0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
1ec00 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
1ec10 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
1ec20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
1ec30 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
1ec40 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
1ec50 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1ec60 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
1ec70 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
1ec80 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
1ec90 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
1eca0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
1ecb0 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
1ecc0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
1ecd0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
1ece0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
1ecf0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
1ed00 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
1ed10 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
1ed20 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
1ed30 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
1ed40 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
1ed50 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
1ed60 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
1ed70 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
1ed80 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
1ed90 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1eda0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1edb0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1edc0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1edd0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1ede0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1edf0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
1ee00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1ee10 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1ee20 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1ee30 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  e. This is alway
1ee40 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  s 0 for unix..*/
1ee50 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ee60 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1ee70 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
1ee80 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1ee90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1eea0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1eeb0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1eec0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
1eed0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1eee0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
1eef0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
1ef00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef10 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
1ef20 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
1ef30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1ef50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1efa0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
1efb0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
1efc0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
1efd0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1efe0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
1eff0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
1f000 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
1f010 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
1f020 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
1f030 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
1f040 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
1f050 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
1f060 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
1f070 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
1f080 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
1f090 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1f0a0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
1f0b0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
1f0c0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
1f0d0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
1f0e0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
1f0f0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
1f100 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
1f110 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
1f120 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
1f130 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
1f140 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
1f150 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
1f160 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
1f170 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
1f180 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1f190 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
1f1a0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
1f1b0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
1f1c0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
1f1d0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
1f1e0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
1f1f0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
1f200 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
1f210 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
1f220 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
1f230 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 0a 2a  om that..**.**.*
1f240 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
1f250 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
1f260 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
1f270 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
1f280 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
1f290 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1f2a0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
1f2b0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
1f2c0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
1f2d0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
1f2e0 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
1f2f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
1f300 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
1f310 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
1f320 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
1f330 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
1f340 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
1f350 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
1f360 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
1f370 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
1f380 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
1f390 2c 20 4d 45 54 48 4f 44 2c 20 43 4c 4f 53 45 2c  , METHOD, CLOSE,
1f3a0 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
1f3b0 4b 4c 4f 43 4b 29 20 20 20 20 20 20 20 20 20 20  KLOCK)          
1f3c0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
1f3d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1f3e0 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
1f3f0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 5c 0a 20 20 20 31 2c 20 20 20 20 20      \.   1,     
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1f440 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
1f560 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f570 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f5a0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f5f0 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f610 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f640 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f660 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f690 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6b0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f6e0 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f700 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f710 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
1f720 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1f730 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
1f740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1f750 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1f780 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
1f790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1f7a0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1f7d0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1f7e0 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65 76  istics   /* xDev
1f7f0 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
1f800 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1f810 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1f870 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1f880 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 28  methods *FINDER(
1f890 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1f8a0 6e 74 20 68 29 7b 20 20 20 20 20 20 20 20 20 20  nt h){          
1f8b0 20 20 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f       \.  UNUSED_
1f8c0 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
1f8d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 68  USED_PARAMETER(h
1f8e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
1f910 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65     \.}../*.** He
1f960 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
1f970 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
1f980 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
1f990 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
1f9a0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
1f9b0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
1f9c0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
1f9d0 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
1f9e0 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
1f9f0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
1fa00 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
1fa10 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1fa20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1fa30 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1fa40 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
1fa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1fa60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1fa70 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1fa80 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1faa0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1fab0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fad0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1fae0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
1faf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1fb00 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1fb10 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1fb20 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78  vedLock     /* x
1fb30 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1fb40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a 49  k method */.);.I
1fb50 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
1fb60 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
1fb70 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1fb80 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1fb90 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
1fba0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
1fbb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1fbc0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1fbd0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbf0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1fc00 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc20 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1fc30 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc50 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1fc60 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
1fc70 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a  eservedLock   /*
1fc80 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1fc90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b  ock method */.);
1fca0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
1fcb0 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
1fcc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1fcd0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1fce0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
1fcf0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
1fd00 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1fd10 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1fd20 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
1fd30 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1fd40 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1fd50 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
1fd60 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1fd70 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1fd80 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
1fd90 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
1fda0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1fdb0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
1fdc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1fdd0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1fde0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1fdf0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  );..#if SQLITE_E
1fe00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1fe10 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
1fe20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
1fe30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1fe40 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1fe50 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
1fe60 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1fe70 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1fe80 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1fe90 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c  ame */.  flockCl
1fea0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1feb0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1fec0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f  hod */.  flockLo
1fed0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1fee0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1fef0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c  od */.  flockUnl
1ff00 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ff10 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1ff20 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68  hod */.  flockCh
1ff30 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1ff40 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1ff50 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1ff60 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  */.);.#endif..#i
1ff70 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
1ff80 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
1ff90 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1ffa0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1ffb0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1ffc0 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1ffe0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1fff0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
20000 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
20010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20020 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
20030 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
20040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20050 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
20060 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
20070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
20080 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
20090 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
200a0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
200b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
200c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a 23  k method */.);.#
200d0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
200e0 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26  ed(__DARWIN__) &
200f0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
20100 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
20110 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
20120 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
20130 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
20140 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
20150 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
20160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
20170 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20180 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
20190 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
201c0 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
201f0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
20200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20210 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
20220 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
20230 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
20240 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20250 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a  ck method */.);.
20260 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
20270 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
20280 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
20290 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
202a0 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
202b0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
202c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
202d0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
202e0 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20300 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
20310 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20330 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
20340 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20360 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
20370 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
20380 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
20390 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
203a0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
203b0 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  ;.#endif...#if d
203c0 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
203d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
203e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
203f0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
20400 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
20410 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
20420 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
20430 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
20440 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
20450 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
20460 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
20470 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
20480 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
20490 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
204a0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
204b0 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
204c0 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
204d0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
204e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
204f0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
20500 63 6b 49 6f 46 69 6e 64 65 72 28 0a 20 20 63 6f  ckIoFinder(.  co
20510 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
20520 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
20530 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20540 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20  ile */.  int fd 
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 72 69    /* file descri
20570 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
20580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20590 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
205a0 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
205b0 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
205c0 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
205d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
205e0 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
205f0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
20600 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
20610 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
20620 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
20630 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
20640 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
20650 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
20660 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
20670 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
20680 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
20690 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
206a0 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
206b0 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 69 66 64 65  Methods },.#ifde
206c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
206d0 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a  AFP_LOCKING_SMB.
206e0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
206f0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
20700 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d  .#else.    { "sm
20710 62 66 73 22 2c 20 20 26 66 6c 6f 63 6b 49 6f 4d  bfs",  &flockIoM
20720 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6e 64 69 66  ethods },.#endif
20730 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
20740 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
20750 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
20760 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
20770 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
20780 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
20790 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
207a0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
207b0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
207c0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
207d0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
207e0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
207f0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
20800 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
20810 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
20820 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
20830 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
20840 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
20850 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
20860 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
20870 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
20880 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
20890 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
208a0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
208b0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
208c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
208d0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
208e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
208f0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
20900 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
20910 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
20920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20930 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
20940 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
20950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20960 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
20970 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
20980 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
20990 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
209a0 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
209b0 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
209c0 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
209d0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
209e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
209f0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
20a00 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
20a10 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
20a20 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
20a30 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
20a40 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
20a50 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
20a60 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
20a70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
20a80 66 28 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  f( fcntl(fd, F_G
20a90 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
20aa0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
20ab0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
20ac0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
20ad0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
20ae0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
20af0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
20b00 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20  ned(__DARWIN__) 
20b10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
20b20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
20b30 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
20b40 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
20b50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
20b60 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
20b70 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
20b80 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
20b90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
20ba0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
20bb0 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 0a  t char*,int);...
20bc0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
20bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
20c30 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
20c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
20c60 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
20c70 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
20c80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
20c90 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
20ca0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
20cb0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
20cc0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
20cd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
20ce0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
20cf0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
20d00 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
20d10 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
20d20 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
20d30 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
20d40 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
20d50 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
20d80 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
20d90 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
20da0 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20 20  /.  int dirfd,  
20db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
20dc0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
20dd0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
20de0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
20df0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
20e00 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
20e10 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
20e20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20e30 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
20e40 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
20e50 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
20e60 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
20e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
20e80 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
20e90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
20ea0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te            /*
20eb0 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
20ec0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
20ed0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20ee0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
20ef0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
20f00 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
20f10 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
20f20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20f30 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
20f40 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c  New->pLock==NULL
20f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
20f60 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20  ew->pOpen==NULL 
20f70 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
20f80 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
20f90 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
20fa0 72 6b 73 2e 20 50 61 72 61 6d 65 74 65 72 20 70  rks. Parameter p
20fb0 56 66 73 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  Vfs is only.  **
20fc0 20 75 73 65 64 20 69 66 20 45 4e 41 42 4c 45 5f   used if ENABLE_
20fd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
20fe0 20 64 65 66 69 6e 65 64 2e 20 45 78 70 72 65 73   defined. Expres
20ff0 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c  s this explicitl
21000 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20  y .  ** here to 
21010 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
21020 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
21030 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
21040 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  s..  */.#if !OS_
21050 56 58 57 4f 52 4b 53 0a 20 20 55 4e 55 53 45 44  VXWORKS.  UNUSED
21060 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c  _PARAMETER(isDel
21070 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ete);.#endif.#if
21080 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
21090 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
210a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
210b0 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 23  (pVfs);.#endif.#
210c0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if !OS_VXWORKS &
210d0 26 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  & !SQLITE_ENABLE
210e0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
210f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
21100 52 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  R(zFilename);.#e
21110 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 33  ndif..  OSTRACE3
21120 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
21130 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
21140 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d  me);    .  pNew-
21150 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
21160 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20  dirfd = dirfd;. 
21170 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e   SET_THREADID(pN
21180 65 77 29 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ew);..#if OS_VXW
21190 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
211a0 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
211b0 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
211c0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
211d0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63  ==0 ){.    noLoc
211e0 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
211f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21200 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
21210 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  noLock ){.    pL
21220 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
21230 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
21240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
21250 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 28  ckingStyle = (*(
21260 66 69 6e 64 65 72 5f 74 79 70 65 29 70 56 66 73  finder_type)pVfs
21270 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
21280 65 6e 61 6d 65 2c 20 68 29 3b 0a 23 69 66 20 53  ename, h);.#if S
21290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
212a0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
212b0 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
212c0 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
212d0 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
212e0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
212f0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
21300 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
21310 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
21320 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
21330 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
21340 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
21350 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
21360 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
21370 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
21380 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
21390 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
213a0 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
213b0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
213c0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
213d0 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
213e0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 75 6e 69  thods ){.    uni
213f0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
21400 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
21410 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
21420 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e  ->pLock, &pNew->
21430 70 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78  pOpen);.    unix
21440 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
21450 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
21460 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21470 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
21480 44 41 52 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  DARWIN__).  else
21490 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
214a0 6c 65 20 3d 3d 20 26 61 70 66 49 6f 4d 65 74 68  le == &apfIoMeth
214b0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
214c0 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
214d0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
214e0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
214f0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
21500 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
21510 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
21520 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
21530 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
21540 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
21550 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
21560 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
21570 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
21580 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
21590 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
215a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
215b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
215c0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
215d0 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
215e0 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
215f0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
21600 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
21610 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
21620 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
21630 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
21640 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
21650 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
21660 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
21670 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
21680 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ilename;.      s
21690 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
216a0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
216b0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
216c0 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65  findLockInfo(pNe
216d0 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e 65 77 2d 3e  w, NULL, &pNew->
216e0 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 75 6e  pOpen);.      un
216f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
21700 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
21710 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
21720 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21730 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
21740 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
21750 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
21760 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
21770 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
21780 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
21790 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
217a0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
217b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
217c0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
217d0 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
217e0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
217f0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
21800 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
21810 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
21820 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
21830 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
21840 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
21850 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
21860 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
21870 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21880 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
218b0 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
218c0 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
218d0 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
218e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
218f0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
21900 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
21910 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
21920 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
21930 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
21940 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
21950 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
21960 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
21970 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
21980 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
21990 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
219a0 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
219b0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
219c0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
219d0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
219e0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
219f0 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  indLockInfo(pNew
21a00 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
21a10 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
21a20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
21a30 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
21a40 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55  >pOpen->pSem==NU
21a50 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
21a60 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
21a70 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
21a80 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
21a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21aa0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
21ab0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
21ac0 20 22 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20   "%s.sem",.     
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
21af0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
21b00 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b 20 7a 53      for( n=0; zS
21b10 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
21b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
21b30 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
21b40 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
21b50 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
21b60 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  Open->pSem = sem
21b70 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
21b80 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
21b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
21ba0 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d  w->pOpen->pSem =
21bb0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
21bc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21bd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21be0 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e     pNew->pOpen->
21bf0 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
21c00 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
21c10 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
21c20 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
21c30 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
21c40 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
21c50 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
21c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21c70 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
21c80 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
21c90 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
21ca0 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
21cb0 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
21cc0 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
21cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
21ce0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
21cf0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
21d00 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61  ilent leak if fa
21d10 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
21d20 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  rror */.    clos
21d30 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(h);.  }else{. 
21d40 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
21d50 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
21d60 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
21d70 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
21d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21d90 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
21da0 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
21db0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
21dc0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
21dd0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
21de0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
21df0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
21e00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21e10 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
21e20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
21e30 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21e40 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
21e50 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
21e60 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
21e70 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
21e80 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
21e90 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
21ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
21eb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21ec0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
21ed0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
21ee0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
21ef0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
21f00 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
21f10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
21f20 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
21f30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
21f40 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
21f50 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
21f60 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
21f70 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
21f80 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
21f90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
21fa0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
21fb0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
21fc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
21fd0 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  i=strlen(zDirnam
21fe0 65 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69  e); ii>=0 && zDi
21ff0 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
22000 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
22010 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
22020 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
22030 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72    fd = open(zDir
22040 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
22050 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
22060 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
22070 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
22080 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20        fcntl(fd, 
22090 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
220a0 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
220b0 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
220c0 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
220d0 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
220e0 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
220f0 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rname);.    }.  
22100 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
22110 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
22120 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f  QLITE_OK:SQLITE_
22130 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a  CANTOPEN);.}../*
22140 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
22150 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
22160 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
22170 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
22180 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
22190 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
221a0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
221b0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
221c0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
221d0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
221e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
221f0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
22200 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
22210 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
22220 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
22230 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
22240 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
22250 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
22260 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
22270 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
22280 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
22290 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
222a0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
222b0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
222c0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
222d0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
222e0 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
222f0 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
22300 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
22310 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
22320 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
22330 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20   *zDir = ".";.. 
22340 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
22350 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
22360 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
22370 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
22380 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
22390 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
223a0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
223b0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
223c0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
223d0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
223e0 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
223f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
22400 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
22410 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  ;..  azDirs[0] =
22420 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
22430 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e  rectory;.  if (N
22440 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d  ULL == azDirs[1]
22450 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31  ) {.    azDirs[1
22460 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
22470 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66  IR");.  }.  .  f
22480 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
22490 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
224a0 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29  azDirs[0]); i++)
224b0 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73  {.    if( azDirs
224c0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
224d0 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  e;.    if( stat(
224e0 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29  azDirs[i], &buf)
224f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22500 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
22510 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
22520 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61  tinue;.    if( a
22530 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c  ccess(azDirs[i],
22540 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
22550 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69  .    zDir = azDi
22560 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b  rs[i];.    break
22570 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
22580 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
22590 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
225a0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
225b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
225c0 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
225d0 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
225e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
225f0 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
22600 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
22610 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
22620 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
22630 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
22640 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22650 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
22660 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
22670 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
22680 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
22690 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
226a0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
226b0 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
226c0 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
226d0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
226e0 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
226f0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
22700 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
22710 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
22720 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
22730 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
22740 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
22750 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
22760 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
22770 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a  }while( access(z
22780 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
22790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
227a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  .}.../*.** Open 
227b0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
227c0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
227d0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
227e0 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
227f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
22800 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
22810 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
22820 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
22830 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
22840 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
22850 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
22860 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
22870 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
22880 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
22890 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
228a0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
228b0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
228c0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
228d0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
228e0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
228f0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
22900 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
22910 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
22920 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
22930 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
22940 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
22950 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
22960 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
22970 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
22980 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
22990 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
229a0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
229b0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
229c0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
229d0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
229e0 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
229f0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
22a00 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
22a10 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
22a20 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
22a30 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
22a40 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
22a50 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
22a60 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
22a70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
22a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22a90 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
22aa0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
22ab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
22ac0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
22ad0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
22ae0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
22af0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
22b00 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
22b10 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
22b20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
22b30 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22b50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22b60 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
22b70 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
22ba0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
22bb0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
22bc0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
22bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
22be0 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
22bf0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
22c00 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 66 64  e */.){.  int fd
22c10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22c20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
22c30 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
22c40 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
22c50 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20  /.  int dirfd = 
22c60 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
22c70 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
22c80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22c90 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
22ca0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
22cb0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
22cc0 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
22cd0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
22ce0 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
22cf0 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
22d00 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
22d10 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d30 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
22d40 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
22d50 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
22d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e  SQLITE_OK;..  in
22d70 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
22d80 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
22d90 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
22da0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
22db0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
22dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22dd0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
22de0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
22df0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
22e00 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
22e10 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
22e20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
22e30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
22e40 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
22e50 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
22e60 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
22e70 41 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20  ADWRITE);..  /* 
22e80 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
22e90 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
22ea0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
22eb0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
22ec0 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
22ed0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
22ee0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
22ef0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
22f00 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
22f10 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
22f20 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
22f30 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
22f40 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
22f50 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
22f60 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  t isOpenDirector
22f70 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  y = (isCreate &&
22f80 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d   .      (eType==
22f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
22fa0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  ER_JOURNAL || eT
22fb0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
22fc0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
22fd0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   );..  /* If arg
22fe0 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
22ff0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
23000 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23010 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
23020 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
23030 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
23040 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
23050 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
23060 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
23070 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
23080 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+1];.  const
23090 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
230a0 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
230b0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
230c0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
230d0 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
230e0 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
230f0 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
23100 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
23110 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
23120 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
23130 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
23140 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
23150 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
23160 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
23170 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
23180 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
23190 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
231a0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
231b0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
231c0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
231d0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
231e0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
231f0 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
23200 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
23210 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
23220 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
23230 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
23240 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
23250 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
23260 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
23270 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
23280 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
23290 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
232a0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
232b0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
232c0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d  n journal, and m
232d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
232e0 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69  e never automati
232f0 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74  cally.  ** delet
23300 65 64 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ed.  */.  assert
23310 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  ( eType!=SQLITE_
23320 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c 20  OPEN_MAIN_DB || 
23330 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
23340 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
23350 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
23360 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c  OURNAL || !isDel
23370 65 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ete );.  assert(
23380 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23390 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
233a0 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  AL || !isDelete 
233b0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
233c0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
233d0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
233e0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
233f0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
23400 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
23410 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23420 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
23430 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
23440 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
23450 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23460 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23470 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23480 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
23490 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
234a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
234b0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
234c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
234d0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
234e0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
234f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23500 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20  N_TRANSIENT_DB. 
23510 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46   );..  memset(pF
23520 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
23530 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
23540 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
23550 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
23560 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
23570 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ory);.    rc = g
23580 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
23590 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
235a0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
235b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
235c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
235d0 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
235e0 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
235f0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
23600 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
23610 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
23620 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
23630 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
23640 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
23650 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
23660 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
23670 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
23680 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
23690 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
236a0 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
236b0 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
236c0 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66  |O_BINARY);..  f
236d0 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
236e0 6f 70 65 6e 46 6c 61 67 73 2c 20 69 73 44 65 6c  openFlags, isDel
236f0 65 74 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f  ete?0600:SQLITE_
23700 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
23710 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 4f 53 54  MISSIONS);.  OST
23720 52 41 43 45 34 28 22 4f 50 45 4e 58 20 20 20 25  RACE4("OPENX   %
23730 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
23740 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
23750 61 67 73 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ags);.  if( fd<0
23760 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
23770 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
23780 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
23790 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65   ){.    /* Faile
237a0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
237b0 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
237c0 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
237d0 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
237e0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
237f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23800 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
23810 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20  ATE);.    flags 
23820 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
23830 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74  EADONLY;.    ret
23840 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66  urn unixOpen(pVf
23850 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c  s, zPath, pFile,
23860 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
23870 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  s);.  }.  if( fd
23880 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
23890 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
238a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65  ;.  }.  if( isDe
238b0 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
238c0 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
238d0 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
238e0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
238f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
23900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23910 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
23920 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e 69 78  else{.    ((unix
23930 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6f 70  File*)pFile)->op
23940 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
23950 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
23960 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
23970 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
23980 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
23990 20 20 61 73 73 65 72 74 28 66 64 21 3d 30 29 3b    assert(fd!=0);
239a0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72  .  if( isOpenDir
239b0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63  ectory ){.    rc
239c0 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
239d0 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
239e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
239f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23a00 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
23a10 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
23a20 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20  ail, already in 
23a30 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
23a40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23a50 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43    }..#ifdef FD_C
23a60 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66  LOEXEC.  fcntl(f
23a70 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
23a80 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
23a90 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
23aa0 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
23ab0 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
23ac0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
23ad0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
23ae0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
23af0 0a 20 20 69 66 28 20 7a 50 61 74 68 21 3d 4e 55  .  if( zPath!=NU
23b00 4c 4c 20 26 26 20 21 6e 6f 4c 6f 63 6b 20 29 7b  LL && !noLock ){
23b10 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
23b20 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
23b30 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
23b40 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
23b50 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
23b60 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
23b70 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
23b80 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
23b90 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
23ba0 72 6f 78 79 2c 20 0a 20 20 20 20 2a 2a 20 30 20  roxy, .    ** 0 
23bb0 6d 65 61 6e 73 20 6e 65 76 65 72 20 75 73 65 20  means never use 
23bc0 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
23bd0 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
23be0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
23bf0 6f 6e 6c 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  only.    */.    
23c00 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
23c10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
23c20 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
23c30 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
23c40 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  se{.      struct
23c50 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
23c60 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
23c70 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
23c80 29 20 3d 3d 20 2d 31 20 29 7b 0a 09 09 09 09 28  ) == -1 ){.....(
23c90 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
23ca0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
23cb0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
23cc0 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ( dirfd>=0 ) clo
23cd0 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69  se(dirfd); /* si
23ce0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
23cf0 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
23d00 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 66  .        close(f
23d10 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
23d20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
23d30 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
23d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23d50 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
23d60 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50      }.      useP
23d70 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
23d80 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
23d90 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
23da0 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
23db0 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
23dc0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
23dd0 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
23de0 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69  zPath, noLock, i
23df0 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  sDelete);.      
23e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23e10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
23e20 3d 20 74 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  = transformUnixF
23e30 69 6c 65 46 6f 72 4c 6f 63 6b 50 72 6f 78 79 28  ileForLockProxy(
23e40 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
23e50 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
23e60 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
23e70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
23e80 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
23e90 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  rn fillInUnixFil
23ea0 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
23eb0 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
23ec0 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74   noLock, isDelet
23ed0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  e);.}../*.** Del
23ee0 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
23ef0 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
23f00 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
23f10 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
23f20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
23f30 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
23f40 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
23f50 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
23f60 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
23f70 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
23f80 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
23f90 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
23fa0 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
23fb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
23fc0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
23fd0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
23fe0 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
23ff0 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
24000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
24010 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
24020 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
24030 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
24040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24050 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
24060 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24070 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
24080 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
24090 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
240a0 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
240b0 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
240c0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
240d0 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
240e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
240f0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
24100 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
24110 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
24120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
24130 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
24140 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
24150 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
24160 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
24170 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
24180 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24190 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
241a0 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
241b0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
241c0 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
241d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
241e0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
241f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24200 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
24210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
24220 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
24230 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
24240 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
24250 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
24260 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
24270 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
24280 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
24290 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
242a0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
242b0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
242c0 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
242d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
242e0 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
242f0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
24300 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
24310 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
24320 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
24330 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
24340 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
24350 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
24360 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
24370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
24380 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
24390 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
243a0 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
243b0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
243c0 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
243d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
243e0 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
243f0 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
24400 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
24410 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
24420 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
24430 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
24440 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
24450 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
24460 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
24470 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
24480 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
24490 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
244a0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
244b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
244c0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
244d0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
244e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
244f0 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
24500 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
24510 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
24520 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
24530 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
24540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24550 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
24560 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
24570 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
24580 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
24590 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
245a0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
245b0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
245c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
245d0 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
245e0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
245f0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
24600 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
24610 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
24620 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
24630 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
24640 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
24650 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
24660 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
24670 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
24680 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
24690 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
246a0 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
246b0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
246c0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
246d0 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
246e0 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
246f0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
24700 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
24710 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
24720 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
24730 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
24740 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
24750 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
24760 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
24770 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
24780 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
24790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
247a0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
247b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
247c0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
247d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
247e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
247f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
24800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
24810 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
24820 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
24830 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24850 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
24860 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
24870 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
248a0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
248b0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
248c0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
248d0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
248e0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
248f0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
24900 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
24910 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
24920 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
24930 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
24940 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
24950 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
24960 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
24970 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
24980 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
24990 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
249a0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
249b0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
249c0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
249d0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
249e0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
249f0 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
24a00 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
24a10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
24a20 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
24a30 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
24a40 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
24a50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
24a60 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
24a70 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
24a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24a90 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
24aa0 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
24ab0 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
24ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24ad0 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
24ae0 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65      nCwd = strle
24af0 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
24b00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
24b10 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
24b20 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
24b30 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
24b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24b60 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
24b70 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
24b80 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
24b90 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
24ba0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
24bb0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
24bc0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
24bd0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
24be0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
24bf0 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
24c00 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
24c10 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
24c20 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
24c30 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
24c40 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
24c50 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24c60 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
24c70 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
24c80 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
24c90 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
24ca0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
24cb0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
24cc0 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
24cd0 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
24ce0 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
24cf0 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
24d00 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
24d10 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
24d20 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
24d30 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
24d40 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
24d50 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
24d60 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
24d70 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
24d80 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
24d90 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
24da0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
24db0 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
24dc0 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
24dd0 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
24de0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
24df0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
24e00 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
24e10 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
24e20 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  ut){.  char *zEr
24e30 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
24e40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
24e50 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
24e60 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
24e70 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
24e80 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
24e90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
24ea0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
24eb0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
24ec0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
24ed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
24ee0 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
24ef0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
24f00 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
24f10 73 74 20 63 68 61 72 2a 7a 53 79 6d 62 6f 6c 29  st char*zSymbol)
24f20 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24f30 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
24f40 20 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48   return dlsym(pH
24f50 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
24f60 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
24f70 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
24f80 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
24f90 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
24fa0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24fb0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
24fc0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
24fd0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
24fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
24ff0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
25000 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
25010 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
25020 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
25030 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
25040 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
25050 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
25060 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
25070 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
25080 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
25090 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
250a0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
250b0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
250c0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
250d0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
250e0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
250f0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
25100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25110 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
25120 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
25130 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
25140 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
25150 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
25160 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
25170 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
25180 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
25190 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
251a0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
251b0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
251c0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
251d0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
251e0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
251f0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
25200 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
25210 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
25220 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
25230 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
25240 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
25250 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
25260 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
25270 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
25280 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
25290 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
252a0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
252b0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
252c0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
252d0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
252e0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
252f0 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
25300 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
25310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
25320 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
25330 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
25340 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
25350 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
25360 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
25370 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
25380 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
25390 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
253a0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
253b0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
253c0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
253d0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
253e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
253f0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
25400 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
25410 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
25420 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
25430 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
25440 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
25450 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
25460 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
25470 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
25480 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
25490 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
254a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
254b0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
254c0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
254d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
254e0 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
254f0 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
25500 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
25510 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
25520 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
25530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42   }else{.      nB
25540 75 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42  uf = read(fd, zB
25550 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20  uf, nBuf);.     
25560 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
25570 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
25580 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
25590 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
255a0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
255b0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
255c0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
255d0 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
255e0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
255f0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
25600 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
25610 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
25620 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
25630 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
25640 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
25650 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
25660 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
25670 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
25680 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
25690 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
256a0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
256b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
256c0 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
256d0 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
256e0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
256f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25700 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
25710 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
25720 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
25730 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
25740 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
25750 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
25760 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
25770 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
25780 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
25790 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
257a0 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
257b0 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
257c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
257d0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
257e0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
257f0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
25800 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
25810 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65  roseconds);.  re
25820 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
25830 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
25840 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
25850 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
25860 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
25870 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75  seconds);.  retu
25880 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
25890 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55  00;.#endif.  UNU
258a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
258b0 74 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tUsed);.}../*.**
258c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
258d0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
258e0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
258f0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
25900 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
25910 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
25920 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
25930 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
25940 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
25950 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
25960 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
25970 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
25980 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
25990 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
259a0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
259b0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
259c0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
259d0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
259e0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
259f0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
25a00 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
25a10 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
25a20 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
25a30 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
25a40 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
25a50 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
25a60 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
25a70 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
25a80 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
25a90 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
25aa0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
25ab0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
25ac0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
25ad0 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
25ae0 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65   *prNow){.#if de
25af0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
25b00 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
25b10 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f  ime(&t);.  *prNo
25b20 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20  w = t/86400.0 + 
25b30 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66  2440587.5;.#elif
25b40 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
25b50 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
25b60 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
25b70 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
25b80 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
25b90 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35  rNow = 2440587.5
25ba0 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38   + sNow.tv_sec/8
25bb0 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76  6400.0 + sNow.tv
25bc0 5f 6e 73 65 63 2f 38 36 34 30 30 30 30 30 30 30  _nsec/8640000000
25bd0 30 30 30 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20  0000.0;.#else.  
25be0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
25bf0 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
25c00 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
25c10 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
25c20 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
25c30 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
25c40 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30  .tv_usec/8640000
25c50 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a  0000.0;.#endif..
25c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
25c70 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
25c80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
25c90 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
25ca0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
25cb0 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
25cc0 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
25cd0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
25ce0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
25cf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
25d00 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
25d10 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
25d20 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
25d30 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
25d40 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
25d50 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
25d60 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
25d70 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
25d80 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
25d90 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
25da0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
25db0 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
25dc0 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
25dd0 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
25de0 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
25df0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
25e00 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
25e10 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
25e20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
25e30 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
25e40 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
25e50 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
25e60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
25e70 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
25e80 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
25e90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25ea0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
25eb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
25ec0 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
25ed0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
25ee0 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
25ef0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  0;.}../*.*******
25f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f10 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
25f20 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
25f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
25f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f90 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
25fa0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
25fb0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
25fc0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
25fd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25fe0 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
25ff0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
26000 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
26010 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
26020 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
26030 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
26040 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
26050 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
26060 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
26070 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
26080 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
26090 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
260a0 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
260b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
260c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
260d0 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
260e0 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
260f0 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
26100 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
26110 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
26120 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
26130 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
26140 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
26150 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
26160 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
26170 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
26180 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
26190 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
261a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
261b0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
261c0 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
261d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
261e0 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
261f0 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
26200 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
26210 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
26220 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
26230 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
26240 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
26250 74 6f 20 61 20 22 66 69 6e 64 65 72 22 0a 20 20  to a "finder".  
26260 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
26270 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74  e FINDER paramet
26280 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  er to this macro
26290 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
262a0 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
262b0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
262c0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
262d0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
262e0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
262f0 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
26300 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
26310 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
26320 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
26330 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
26340 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
26350 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
26360 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
26370 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
26380 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
26390 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
263a0 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
263b0 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
263c0 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
263d0 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
263e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
263f0 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
26400 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
26410 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
26420 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
26430 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
26440 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
26450 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
26460 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
26470 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
26480 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
26490 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
264a0 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
264b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
264c0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
264d0 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
264e0 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
264f0 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
26500 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
26510 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
26520 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31           \.    1
26530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26540 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
26550 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26560 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
26570 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
26580 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
26590 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
265a0 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
265b0 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
265c0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
265d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
265e0 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26600 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26640 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26660 0a 20 20 20 20 28 76 6f 69 64 2a 29 46 49 4e 44  .    (void*)FIND
26670 45 52 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 41  ER,        /* pA
26680 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
266a0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
266b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
266c0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
266d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
266e0 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
266f0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
26700 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
26710 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
26720 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
26730 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
26740 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
26750 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
26760 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
26770 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
26780 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
26790 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
267a0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
267b0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
267e0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
267f0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
26800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26810 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
26820 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26830 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26850 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
26860 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
26870 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
26890 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
268a0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
268b0 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
268c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
268d0 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
268e0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
268f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26900 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
26910 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
26920 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
26930 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
26940 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
26950 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  xGetLastError   
26960 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
26970 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
26980 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
26990 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
269a0 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
269b0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
269c0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
269d0 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
269e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
269f0 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
26a00 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
26a10 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
26a20 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
26a30 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
26a40 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
26a50 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
26a60 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
26a70 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
26a80 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
26a90 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
26aa0 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
26ab0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26ac0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
26ad0 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
26ae0 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  _).    UNIXVFS("
26af0 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
26b00 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
26b10 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e   ),.#else.    UN
26b20 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
26b30 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69         posixIoFi
26b40 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
26b50 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
26b60 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f  -none",     nolo
26b70 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ckIoFinder ),.  
26b80 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
26b90 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f  dotfile",  dotlo
26ba0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ckIoFinder ),.#i
26bb0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
26bc0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
26bd0 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46  amedsem", semIoF
26be0 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
26bf0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
26c00 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
26c10 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
26c20 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73  x-posix",    pos
26c30 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ixIoFinder ),.  
26c40 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
26c50 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b  flock",    flock
26c60 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
26c70 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
26c80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
26c90 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
26ca0 44 41 52 57 49 4e 5f 5f 29 0a 20 20 20 20 55 4e  DARWIN__).    UN
26cb0 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
26cc0 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64  ,      afpIoFind
26cd0 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
26ce0 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20  S("unix-proxy", 
26cf0 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72     proxyIoFinder
26d00 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   ),.#endif.  };.
26d10 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
26d20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
26d30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
26d40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
26d50 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69   VFSes defined i
26d60 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72  n the aVfs[] arr
26d70 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ay */.  for(i=0;
26d80 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29   i<(sizeof(aVfs)
26d90 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  /sizeof(sqlite3_
26da0 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  vfs)); i++){.   
26db0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
26dc0 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20  ister(&aVfs[i], 
26dd0 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
26de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
26df0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
26e00 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  n the operating 
26e10 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
26e20 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65  ..**.** Some ope
26e30 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d  rating systems m
26e40 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20  ight need to do 
26e50 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20  some cleanup in 
26e60 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  this routine,.**
26e70 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61   to release dyna
26e80 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
26e90 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20  d objects.  But 
26ea0 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20  not on unix..** 
26eb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
26ec0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78  a no-op for unix
26ed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26ee0 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
26ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26f00 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20  OK; .}. .#endif 
26f10 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  /* SQLITE_OS_UNI
26f20 58 20 2a 2f 0a                                   X */.