/ Hex Artifact Content
Login

Artifact e6eacc7ec735ded605fefcbaf250058baa8feb12:


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 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a 0a  e3_os_end()..**.
07f0: 2a 2a 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78 2e  ** $Id: os_unix.
0800: 63 2c 76 20 31 2e 32 33 33 20 32 30 30 38 2f 31  c,v 1.233 2008/1
0810: 32 2f 32 32 20 30 33 3a 33 37 3a 30 30 20 64 61  2/22 03:37:00 da
0820: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
0830: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0840: 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53 51  iteInt.h".#if SQ
0850: 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20  LITE_OS_UNIX    
0860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
0870: 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f  s file is used o
0880: 6e 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a  n unix only */..
0890: 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  /*.** There are 
08a0: 76 61 72 69 6f 75 73 20 6d 65 74 68 6f 64 73 20  various methods 
08b0: 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  for file locking
08c0: 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 63 75 72   used for concur
08d0: 72 65 6e 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  rency.** control
08e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53  :.**.**   1. POS
08f0: 49 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20  IX locking (the 
0900: 64 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32  default),.**   2
0910: 2e 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  . No locking,.**
0920: 20 20 20 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c     3. Dot-file l
0930: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20  ocking,.**   4. 
0940: 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c  flock() locking,
0950: 0a 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c 6f 63  .**   5. AFP loc
0960: 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c  king (OSX only),
0970: 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64 20 50  .**   6. Named P
0980: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 73 20  OSIX semaphores 
0990: 28 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a  (VXWorks only),.
09a0: 2a 2a 20 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f  **   7. proxy lo
09b0: 63 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79  cking. (OSX only
09c0: 29 0a 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34  ).**.** Styles 4
09d0: 2c 20 35 2c 20 61 6e 64 20 37 20 61 72 65 20 6f  , 5, and 7 are o
09e0: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 66  nly available of
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0a00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20  OCKING_STYLE.** 
0a10: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 31 2e  is defined to 1.
0a20: 20 20 54 68 65 20 53 51 4c 49 54 45 5f 45 4e 41    The SQLITE_ENA
0a30: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0a40: 45 20 61 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61  E also enables a
0a50: 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65  utomatic.** sele
0a60: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 70 70  ction of the app
0a70: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
0a80: 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20   style based on 
0a90: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a  the filesystem.*
0aa0: 2a 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61  * where the data
0ab0: 62 61 73 65 20 69 73 20 6c 6f 63 61 74 65 64 2e  base is located.
0ac0: 20 20 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e    .*/.#if !defin
0ad0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
0ae0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a  _LOCKING_STYLE).
0af0: 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #  if defined(__
0b00: 44 41 52 57 49 4e 5f 5f 29 0a 23 20 20 20 20 64  DARWIN__).#    d
0b10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
0b20: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0b30: 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  E 1.#  else.#   
0b40: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
0b50: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0b60: 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  YLE 0.#  endif.#
0b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
0b80: 69 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f 52  ine the OS_VXWOR
0b90: 4b 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72  KS pre-processor
0ba0: 20 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20 62   macro to 1 if b
0bb0: 75 69 6c 64 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76  uilding on .** v
0bc0: 78 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f 74 68  xworks, or 0 oth
0bd0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  erwise..*/.#ifnd
0be0: 65 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20  ef OS_VXWORKS.# 
0bf0: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54   if defined(__RT
0c00: 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  P__) || defined(
0c10: 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20 20  _WRS_KERNEL).#  
0c20: 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f    define OS_VXWO
0c30: 52 4b 53 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  RKS 1.#  else.# 
0c40: 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57     define OS_VXW
0c50: 4f 52 4b 53 20 30 0a 23 20 20 65 6e 64 69 66 0a  ORKS 0.#  endif.
0c60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0c70: 65 73 65 20 23 64 65 66 69 6e 65 73 20 73 68 6f  ese #defines sho
0c80: 75 6c 64 20 65 6e 61 62 6c 65 20 3e 32 47 42 20  uld enable >2GB 
0c90: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e 20  file support on 
0ca0: 50 6f 73 69 78 20 69 66 20 74 68 65 0a 2a 2a 20  Posix if the.** 
0cb0: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
0cc0: 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
0cd0: 6f 72 74 73 20 69 74 2e 20 20 49 66 20 74 68 65  orts it.  If the
0ce0: 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72   OS lacks.** lar
0cf0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 2c  ge file support,
0d00: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65   these should be
0d10: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c   no-ops..**.** L
0d20: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
0d30: 74 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65  t can be disable
0d40: 64 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53 51  d using the -DSQ
0d50: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0d60: 20 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68   switch.** on th
0d70: 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61  e compiler comma
0d80: 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20 69  nd line.  This i
0d90: 73 20 6e 65 63 65 73 73 61 72 79 20 69 66 20 79  s necessary if y
0da0: 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67  ou are compiling
0db0: 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74 20  .** on a recent 
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 37 2e 32 29 20 62 75 74 20 79 6f 75  Hat 7.2) but you
0de0: 20 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65 20   want your code 
0df0: 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e  to work.** on an
0e00: 20 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20 28   older machine (
0e10: 65 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29 2e  ex: RedHat 6.0).
0e20: 20 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65    If you compile
0e30: 20 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a 2a   on RedHat 7.2.*
0e40: 2a 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 6f  * without this o
0e50: 70 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e  ption, LFS is en
0e60: 61 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20 64  able.  But LFS d
0e70: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e  oes not exist in
0e80: 20 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69   the kernel.** i
0e90: 6e 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73 6f  n RedHat 6.0, so
0ea0: 20 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20   the code won't 
0eb0: 77 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f  work.  Hence, fo
0ec0: 72 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79  r maximum binary
0ed0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ee0: 79 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20  you should omit 
0ef0: 4c 46 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  LFS..**.** The p
0f00: 72 65 76 69 6f 75 73 20 70 61 72 61 67 72 61 70  revious paragrap
0f10: 68 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  h was written in
0f20: 20 32 30 30 35 2e 20 20 28 54 68 69 73 20 70 61   2005.  (This pa
0f30: 72 61 67 72 61 70 68 20 69 73 20 77 72 69 74 74  ragraph is writt
0f40: 65 6e 0a 2a 2a 20 6f 6e 20 32 30 30 38 2d 31 31  en.** on 2008-11
0f50: 2d 32 38 2e 29 20 54 68 65 73 65 20 64 61 79 73  -28.) These days
0f60: 2c 20 61 6c 6c 20 4c 69 6e 75 78 20 6b 65 72 6e  , all Linux kern
0f70: 65 6c 73 20 73 75 70 70 6f 72 74 20 6c 61 72 67  els support larg
0f80: 65 20 66 69 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79  e files, so.** y
0f90: 6f 75 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ou should probab
0fa0: 6c 79 20 6c 65 61 76 65 20 4c 46 53 20 65 6e 61  ly leave LFS ena
0fb0: 62 6c 65 64 2e 20 20 42 75 74 20 73 6f 6d 65 20  bled.  But some 
0fc0: 65 6d 62 65 64 64 65 64 20 70 6c 61 74 66 6f 72  embedded platfor
0fd0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 6c 61 63 6b  ms might.** lack
0fe0: 20 4c 46 53 20 69 6e 20 77 68 69 63 68 20 63 61   LFS in which ca
0ff0: 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 44 49  se the SQLITE_DI
1000: 53 41 42 4c 45 5f 4c 46 53 20 6d 61 63 72 6f 20  SABLE_LFS macro 
1010: 6d 69 67 68 74 20 73 74 69 6c 6c 20 62 65 20 75  might still be u
1020: 73 65 66 75 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65  seful..*/.#ifnde
1030: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
1040: 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f 4c  _LFS.# define _L
1050: 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20 20  ARGE_FILE       
1060: 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c 45  1.# ifndef _FILE
1070: 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20 20  _OFFSET_BITS.#  
1080: 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f 46   define _FILE_OF
1090: 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20 65  FSET_BITS 64.# e
10a0: 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f 4c  ndif.# define _L
10b0: 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45 20  ARGEFILE_SOURCE 
10c0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
10d0: 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65  standard include
10e0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c   files..*/.#incl
10f0: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
1100: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1110: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
1120: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c   <fcntl.h>.#incl
1130: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
1140: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
1150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1160: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
1170: 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53  <errno.h>..#if S
1180: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1190: 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63  KING_STYLE.# inc
11a0: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
11b0: 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52  h>.# if OS_VXWOR
11c0: 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  KS.#  include <s
11d0: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69  emaphore.h>.#  i
11e0: 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68  nclude <limits.h
11f0: 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c  >.# else.#  incl
1200: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
1210: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
1220: 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 20 69 6e 63  /param.h>.#  inc
1230: 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e  lude <sys/mount.
1240: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
1250: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1260: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1270: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65   */../*.** If we
1280: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1290: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
12a0: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
12b0: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
12c0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
12d0: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
12e0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
12f0: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1300: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
1310: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1320: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
1330: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1340: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
1350: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
1360: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1370: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1380: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1390: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
13a0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
13b0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
13c0: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
13d0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13e0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13f0: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1400: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
1410: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
1420: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
1430: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
1440: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
1450: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
1460: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1470: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1480: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1490: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
14a0: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
14b0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
14c0: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
14d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
14e0: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
14f0: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1500: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
1510: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
1520: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
1530: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
1540: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
1550: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
1560: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1570: 54 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a  TE_BUSY)).../*.*
1580: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1590: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
15a0: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
15b0: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
15c0: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
15d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
15f0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
1600: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
1610: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
1620: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
1630: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
1640: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1650: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74  st entry */.  st
1660: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
1670: 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f   *pOpen;       /
1680: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c  * Info about all
1690: 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20 74 68   open fd's on th
16a0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74  is inode */.  st
16b0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
16c0: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f  o *pLock;      /
16d0: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
16e0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
16f0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
1720: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1730: 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20 20  .  int dirfd;   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1760: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64  riptor for the d
1770: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e  irectory */.  un
1780: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b  signed char lock
1790: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f  type;          /
17a0: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
17b0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
17c0: 66 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  fd */.  int last
17d0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
17e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17f0: 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20  unix errno from 
1800: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
1810: 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f  or */.  void *lo
1820: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
1830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b           /* Lock
1840: 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66  ing style specif
1850: 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ic state */.  in
1860: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1880: 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63  * The flags spec
1890: 69 66 69 65 64 20 61 74 20 6f 70 65 6e 20 2a 2f  ified at open */
18a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
18b0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
18c0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70  d(__linux__).  p
18d0: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
1900: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75  at "owns" this u
1910: 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  nixFile */.#endi
1920: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1930: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1960: 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1970: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
1980: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
1990: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
19a0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19c0: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
19d0: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
19e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
19f0: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
1a00: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
1a10: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1a20: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
1a30: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
1a40: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
1a50: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
1a60: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
1a70: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
1a80: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
1a90: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
1aa0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
1ab0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
1ac0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
1ad0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
1ae0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
1af0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
1b00: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
1b10: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
1b20: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
1b30: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1b40: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
1b50: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
1b60: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
1b70: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
1b80: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
1b90: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
1ba0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
1bb0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
1bc0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
1bd0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
1be0: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
1bf0: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
1c00: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
1c10: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
1c20: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
1c30: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
1c40: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
1c50: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
1c60: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
1c70: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
1c80: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
1c90: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
1ca0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
1cb0: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
1cc0: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
1cd0: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
1ce0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
1cf0: 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e  P__.# define fcn
1d00: 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64  tl(A,B,C) 0.#end
1d10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
1d20: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
1d30: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
1d40: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
1d50: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
1d60: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
1d70: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
1d80: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
1d90: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
1da0: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
1db0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
1dc0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
1dd0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  f.../*.** Helper
1de0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
1df0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
1e00: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
1e10: 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  utex..*/.static 
1e20: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
1e30: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
1e40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e50: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
1e60: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1e70: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
1e80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
1e90: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
1ea0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1eb0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1ec0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1ed0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1ee0: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 0a 23  _MASTER));.}...#
1ef0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f00: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
1f10: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
1f20: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
1f30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1f40: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
1f50: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
1f60: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
1f70: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
1f80: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
1f90: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
1fa0: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
1fb0: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79  nst char *lockty
1fc0: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
1fd0: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
1fe0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
1ff0: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
2000: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
2010: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2020: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2030: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
2040: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
2050: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
2060: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
2070: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
2080: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
2090: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
20a0: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
20b0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
20c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
20d0: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
20e0: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
20f0: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
2100: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
2110: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
2120: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2130: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
2140: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
2150: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
2160: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
2170: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
2180: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
2190: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
21a0: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
21b0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
21c0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
21d0: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
21e0: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
21f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2200: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
2210: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
2220: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
2230: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
2240: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
2250: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
2260: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
2270: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2280: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
2290: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
22a0: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
22b0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
22c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
22d0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
22e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22f0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
2300: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
2310: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
2320: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
2330: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
2340: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2350: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2360: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2370: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
2380: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2390: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
23a0: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
23b0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
23c0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
23d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
23e0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
23f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
2400: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
2410: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
2420: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
2430: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
2440: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2450: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
2460: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
2470: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
2480: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
2490: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
24a0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
24b0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
24c0: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
24d0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
24e0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
24f0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
2500: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
2510: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
2520: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
2530: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
2540: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
2550: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
2560: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
2570: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2580: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2590: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
25a0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
25b0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
25c0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
25d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
25e0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
25f0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2600: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
2610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2620: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
2630: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2640: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
2650: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
2660: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
2670: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
2680: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
2690: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
26a0: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
26b0: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
26c0: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
26d0: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
26e0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
26f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
2700: 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  _TRACE */..../*.
2710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2720: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
2730: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
2740: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
2750: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
2760: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
2770: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
2780: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
2790: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
27a0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
27b0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
27c0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
27d0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
27e0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
27f0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
2800: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
2810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
2820: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
2830: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
2840: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
2850: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
2860: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
2870: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
2880: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
2890: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
28a0: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
28b0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
28c0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
28d0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
28e0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
28f0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
2900: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
2910: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
2920: 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61  sixError) {.  ca
2930: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
2940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2950: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
2960: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
2970: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
2980: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
2990: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
29a0: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
29b0: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
29c0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
29d0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
29e0: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
29f0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
2a00: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
2a10: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
2a20: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
2a30: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
2a40: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
2a50: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
2a60: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
2a70: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
2a80: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
2a90: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
2aa0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
2ab0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
2ac0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
2ad0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
2ae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
2af0: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
2b00: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
2b10: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
2b20: 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  ||..(sqliteIOErr
2b30: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2b40: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
2b50: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  CK) ){.      ret
2b60: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2b70: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c  .    }.    /* el
2b80: 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2b90: 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a  */.  case EPERM:
2ba0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
2bb0: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
2bc0: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
2bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2be0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
2bf0: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
2c00: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
2c10: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
2c20: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
2c30: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
2c40: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
2c50: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
2c60: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
2c70: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
2c80: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
2c90: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
2ca0: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
2cb0: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
2cc0: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
2cd0: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
2ce0: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
2cf0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
2d00: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
2d10: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
2d20: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
2d30: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
2d40: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
2d50: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
2d60: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
2d70: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
2d80: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
2d90: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
2da0: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
2db0: 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41  ENT:.  case ESTA
2dc0: 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  LE:.  case ENOSY
2dd0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
2de0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
2df0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
2e00: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
2e10: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
2e20: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
2e30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
2e40: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
2e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2eb0: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
2ec0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
2ed0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
2ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
2ef0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
2f00: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
2f10: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
2f20: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
2f30: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
2f40: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
2f50: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
2f60: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
2f70: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
2f80: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
2f90: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
2fa0: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
2fb0: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
2fc0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
2fd0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
2fe0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
2ff0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3000: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3010: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
3020: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
3030: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
3040: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
3050: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3060: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
3070: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
3080: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
3090: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
30a0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
30b0: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
30c0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
30d0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
30e0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
30f0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
3100: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
3110: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
3120: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
3130: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
3140: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
3150: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
3160: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
3170: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
3180: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
3190: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
31a0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
31b0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
31c0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
31d0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
31e0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
31f0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
3200: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
3210: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3230: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
3240: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
3250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3280: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
3290: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
32a0: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
32b0: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
32c0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
32d0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
32e0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
32f0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
3300: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
3310: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
3320: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
3330: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
3340: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
3350: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
3360: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
3370: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
3380: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
3390: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
33a0: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
33b0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
33c0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
33d0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
33e0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
33f0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
3400: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
3410: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
3420: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
3430: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
3440: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
3450: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
3460: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
3470: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
3480: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
3490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
34a0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
34b0: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
34c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
34d0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
34e0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
34f0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
3500: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
3510: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
3520: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
3530: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
3540: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
3550: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
3560: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
3570: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3580: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
3590: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
35a0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
35b0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
35c0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
35d0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
35e0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
35f0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3610: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
3620: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
3630: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
3640: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
3650: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
3660: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
3670: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
3680: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
3690: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
36a0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
36b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
36d0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
36e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
36f0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
3700: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
3710: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
3720: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
3730: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
3740: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
3750: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
3760: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
3770: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
3780: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
3790: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
37a0: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
37b0: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
37c0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
37d0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
37e0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
37f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
3800: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
3810: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
3820: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
3830: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
3840: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
3850: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3860: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
3870: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
3880: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3890: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
38a0: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
38b0: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
38c0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
38d0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
38e0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
38f0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
3900: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
3910: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3920: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
3930: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
3940: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
3950: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
3960: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3980: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
3990: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
39a0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
39b0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
39c0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
39d0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
39e0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
39f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
3a00: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
3a10: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
3a20: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3a30: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3a40: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
3a50: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3a60: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
3a70: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3a80: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
3a90: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
3aa0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
3ab0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
3ac0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
3ad0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
3ae0: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
3af0: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
3b00: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
3b10: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
3b20: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
3b30: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
3b40: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
3b50: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
3b60: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
3b70: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
3b80: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
3b90: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
3ba0: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
3bb0: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
3bc0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
3bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
3be0: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
3bf0: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
3c00: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
3c10: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
3c20: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
3c30: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
3c40: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
3c50: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
3c60: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
3c70: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
3c80: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
3c90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
3ca0: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
3cb0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
3cc0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
3cd0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
3ce0: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
3cf0: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
3d00: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
3d10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
3d20: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
3d30: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
3d40: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
3d50: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
3d60: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
3d80: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
3d90: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
3da0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
3db0: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
3dc0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
3dd0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
3de0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
3df0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
3e00: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
3e10: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
3e20: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
3e30: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
3e40: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
3e50: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
3e60: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
3e70: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
3e80: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
3e90: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
3ea0: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
3eb0: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
3ec0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
3ed0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
3ee0: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
3ef0: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
3f00: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
3f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
3f20: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
3f30: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
3f40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
3f50: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
3f70: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
3f80: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
3f90: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
3fb0: 2a 2a 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 2f 0a 0a 0a 2f 2a 2a  *********/.../**
4000: 2a 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 2a 2a 2a 2a  ****************
4020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4060: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
4070: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
40a0: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
40b0: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
40c0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
40d0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
40e0: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
40f0: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
4100: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
4110: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
4120: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
4130: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
4140: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
4150: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
4160: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
4170: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
4180: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
4190: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
41a0: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
41b0: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
41c0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
41d0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
41e0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
41f0: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
4200: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
4210: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
4220: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
4230: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4240: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
4250: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
4260: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
4270: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
4280: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
4290: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
42a0: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
42b0: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
42c0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
42d0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
42e0: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
42f0: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
4300: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
4310: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
4320: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
4330: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
4340: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
4350: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
4360: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
4370: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
4380: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
4390: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
43a0: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
43b0: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
43c0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
43d0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
43e0: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
43f0: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
4400: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
4410: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4420: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
4430: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
4440: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
4450: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
4460: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
4470: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
4480: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
4490: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
44a0: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
44b0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
44c0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
44d0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
44e0: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
44f0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
4500: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
4510: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
4520: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
4530: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
4540: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
4550: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
4560: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
4570: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
4580: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
4590: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
45a0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
45b0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
45c0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
45d0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
45e0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
45f0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
4600: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
4610: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
4620: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
4630: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
4640: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4650: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
4660: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
4670: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
4680: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
4690: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
46a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
46b0: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
46c0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
46d0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
46e0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
46f0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
4700: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
4710: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
4720: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
4730: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
4740: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
4750: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
4760: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
4770: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
4780: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
4790: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
47a0: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
47b0: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
47c0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
47d0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
47e0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
47f0: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
4800: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
4810: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
4820: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
4830: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
4840: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
4850: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
4860: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
4870: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
4880: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
4890: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
48a0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
48b0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
48c0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
48d0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
48e0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
48f0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
4900: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
4910: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
4920: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
4930: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
4940: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
4950: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
4960: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4970: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
4980: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
4990: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
49a0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
49b0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
49c0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
49d0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
49e0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
49f0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
4a00: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
4a10: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
4a20: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
4a30: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
4a40: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
4a50: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
4a60: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
4a70: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
4a80: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
4a90: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
4aa0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
4ab0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
4ac0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
4ad0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
4ae0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
4af0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
4b00: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
4b10: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
4b20: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
4b30: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
4b40: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
4b50: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
4b60: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
4b70: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
4b80: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
4b90: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
4ba0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
4bb0: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
4bc0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
4bd0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
4be0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
4bf0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
4c00: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
4c10: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
4c20: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
4c30: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
4c40: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
4c50: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
4c60: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
4c70: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
4c80: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
4c90: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
4ca0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
4cb0: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
4cc0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
4cd0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
4ce0: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
4cf0: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
4d00: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
4d10: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
4d20: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  File structure c
4d30: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69  ontains.** a poi
4d40: 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e 69 78 4f  nter to an unixO
4d50: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4d60: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
4d70: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
4d80: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65  cture.** per ope
4d90: 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d  n inode, which m
4da0: 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70  eans that multip
4db0: 6c 65 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20  le unixFile can 
4dc0: 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
4dd0: 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e 43 6e 74  e.** unixOpenCnt
4de0: 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  .  When an attem
4df0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
4e00: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
4e10: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
4e20: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
4e30: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
4e40: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
4e50: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
4e60: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
4e70: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
4e80: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
4e90: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
4ea0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
4eb0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4f  ar..** The unixO
4ec0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4ed0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
4ee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4ef0: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
4f00: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
4f10: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
4f20: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
4f30: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
4f40: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
4f50: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
4f60: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
4f70: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
4f80: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
4f90: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
4fa0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
4fb0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
4fc0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
4fd0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
4fe0: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
4ff0: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
5000: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
5010: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
5020: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
5030: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
5040: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
5050: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
5060: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
5070: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
5080: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
5090: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
50a0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
50b0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
50c0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
50d0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
50e0: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
50f0: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
5100: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
5110: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
5120: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
5130: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
5140: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
5150: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
5160: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
5170: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
5180: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
5190: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
51a0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
51b0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
51c0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
51d0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
51e0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
51f0: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
5200: 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65 20 68 61  read B..** We ha
5210: 76 65 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  ve to do a run-t
5220: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
5230: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
5240: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
5250: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
5260: 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 77  .** On systems w
5270: 68 65 72 65 20 74 68 72 65 61 64 20 41 20 69 73  here thread A is
5280: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f 64 69 66   unable to modif
5290: 79 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  y locks created 
52a0: 62 79 0a 2a 2a 20 74 68 72 65 61 64 20 42 2c 20  by.** thread B, 
52b0: 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20  we have to keep 
52c0: 74 72 61 63 6b 20 6f 66 20 77 68 69 63 68 20 74  track of which t
52d0: 68 72 65 61 64 20 63 72 65 61 74 65 64 20 65 61  hread created ea
52e0: 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20 48 65 6e  ch.** lock.  Hen
52f0: 63 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  ce there is an e
5300: 78 74 72 61 20 66 69 65 6c 64 20 69 6e 20 74 68  xtra field in th
5310: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 75 6e 69  e key to the uni
5320: 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72  xLockInfo.** str
5330: 75 63 74 75 72 65 20 74 6f 20 72 65 63 6f 72 64  ucture to record
5340: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
5350: 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68 6f 73 65  n.  And on those
5360: 20 73 79 73 74 65 6d 73 20 69 74 0a 2a 2a 20 69   systems it.** i
5370: 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 62 65 67  s illegal to beg
5380: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
5390: 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 61   in one thread a
53a0: 6e 64 20 66 69 6e 69 73 68 20 69 74 0a 2a 2a 20  nd finish it.** 
53b0: 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20 46 6f 72  in another.  For
53c0: 20 74 68 69 73 20 6c 61 74 74 65 72 20 72 65 73   this latter res
53d0: 74 72 69 63 74 69 6f 6e 2c 20 74 68 65 72 65 20  triction, there 
53e0: 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72 6f 75 6e  is no work-aroun
53f0: 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20 6c 69  d..** It is a li
5400: 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c 69 6e 75  mitation of Linu
5410: 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a  xThreads..*/../*
5420: 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b  .** Set or check
5430: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69   the unixFile.ti
5440: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
5450: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
5460: 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20   an unixFile.** 
5470: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  is first opened.
5480: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
5490: 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69   uses of the uni
54a0: 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61  xFile verify tha
54b0: 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68  t the.** same th
54c0: 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e  read is operatin
54d0: 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c  g on the unixFil
54e0: 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  e.  Some operati
54f0: 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a  ng systems do.**
5500: 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73   not allow locks
5510: 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65   to be overridde
5520: 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61  n by other threa
5530: 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74  ds and that rest
5540: 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73  riction.** means
5550: 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64   that sqlite3* d
5560: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
5570: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20  cannot be moved 
5580: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a  from one thread.
5590: 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ** to another wh
55a0: 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ile locks are he
55b0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f  ld..**.** Versio
55c0: 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31  n 3.3.1 (2006-01
55d0: 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20  -15):  unixFile 
55e0: 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  can be moved fro
55f0: 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a  m one thread to.
5600: 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ** another as lo
5610: 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e  ng as we are run
5620: 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d  ning on a system
5630: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74   that supports t
5640: 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69  hreads.** overri
5650: 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73  ding each others
5660: 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 69 73   locks (which is
5670: 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f   now the most co
5680: 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a  mmon behavior).*
5690: 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73  * or if no locks
56a0: 20 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20   are held.  But 
56b0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f  the unixFile.pLo
56c0: 63 6b 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74  ck field needs t
56d0: 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74  o be.** recomput
56e0: 65 64 20 62 65 63 61 75 73 65 20 69 74 73 20 6b  ed because its k
56f0: 65 79 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  ey includes the 
5700: 74 68 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20  thread-id.  See 
5710: 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72  the .** transfer
5720: 4f 77 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63  Ownership() func
5730: 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61  tion below for a
5740: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
5750: 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ation.*/.#if SQL
5760: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
5770: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
5780: 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 45  x__).# define SE
5790: 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20 20  T_THREADID(X)   
57a0: 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65  (X)->tid = pthre
57b0: 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69  ad_self().# defi
57c0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
57d0: 44 28 58 29 20 28 74 68 72 65 61 64 73 4f 76 65  D(X) (threadsOve
57e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
57f0: 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20  ocks==0 && \.   
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 21 70 74 68 72 65 61           !pthrea
5820: 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64  d_equal((X)->tid
5830: 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  , pthread_self()
5840: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
5850: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
5860: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
5870: 5f 54 48 52 45 41 44 49 44 28 58 29 20 30 0a 23  _THREADID(X) 0.#
5880: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
5890: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
58a0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
58b0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
58c0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
58d0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
58e0: 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ular unixOpenCnt
58f0: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
5900: 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69   its inode.  Thi
5910: 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65  s.** is the same
5920: 20 61 73 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b   as the unixLock
5930: 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74 20  Key except that 
5940: 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69 73  the thread ID is
5950: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72   omitted..*/.str
5960: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
5970: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5990: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
59a0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
59b0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
59c0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
59d0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
59e0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
59f0: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
5a00: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
5a10: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
5a20: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
5a30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
5a40: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
5a50: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5a60: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
5a70: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
5a80: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
5a90: 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  r unixLockInfo s
5aa0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
5ab0: 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ts inode..**.** 
5ac0: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f  If threads canno
5ad0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
5ae0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 4c 69  others locks (Li
5af0: 6e 75 78 54 68 72 65 61 64 73 29 2c 20 74 68 65  nuxThreads), the
5b00: 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74 68 65 20  n we.** set the 
5b10: 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74 69 64 20  unixLockKey.tid 
5b20: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
5b30: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
5b40: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
5b50: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
5b60: 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20 61 6e 64  locks (Posix and
5b70: 20 4e 50 54 4c 29 20 74 68 65 6e 20 74 69 64 20   NPTL) then tid 
5b80: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
5b90: 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64 20 69 73   zero..** tid is
5ba0: 20 6f 6d 69 74 74 65 64 20 69 66 20 77 65 20 63   omitted if we c
5bb0: 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74  ompile without t
5bc0: 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74  hreading support
5bd0: 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a 2a 2a 20   or on an OS.** 
5be0: 6f 74 68 65 72 20 74 68 61 6e 20 6c 69 6e 75 78  other than linux
5bf0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
5c00: 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73 74 72 75  LockKey {.  stru
5c10: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
5c20: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 69 64  d;  /* Unique id
5c30: 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65  entifier for the
5c40: 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c   file */.#if SQL
5c50: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
5c60: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
5c70: 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74  x__).  pthread_t
5c80: 20 74 69 64 3b 20 20 2f 2a 20 54 68 72 65 61 64   tid;  /* Thread
5c90: 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f 77 6e 65   ID of lock owne
5ca0: 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f 74 20 75  r. Zero if not u
5cb0: 73 69 6e 67 20 4c 69 6e 75 78 54 68 72 65 61 64  sing LinuxThread
5cc0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  s */.#endif.};..
5cd0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
5ce0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
5cf0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
5d00: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
5d10: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
5d20: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
5d30: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
5d40: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
5d50: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
5d60: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
5d70: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
5d80: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
5d90: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
5da0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
5db0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
5dc0: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
5dd0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5de0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
5df0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
5e00: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
5e10: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
5e20: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
5e30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
5e40: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
5e50: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
5e60: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20  nixLockInfo {.  
5e70: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b  struct unixLockK
5e80: 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 20  ey lockKey;     
5e90: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
5ea0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  y */.  int cnt; 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5ed0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
5ee0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
5ef0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
5f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5f10: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
5f20: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
5f30: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  etc. */.  int nR
5f40: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
5f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5f60: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
5f70: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
5f80: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
5f90: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4e 65 78  ixLockInfo *pNex
5fa0: 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
5fb0: 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e  f all unixLockIn
5fc0: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
5fd0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
5fe0: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
5ff0: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6000: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a  y linked */.};..
6010: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
6020: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6030: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
6040: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
6050: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
6060: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
6070: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
6080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
6090: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20  ocks on that.** 
60a0: 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f  inode.  If a clo
60b0: 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  se is attempted 
60c0: 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65  against an inode
60d0: 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67   that is holding
60e0: 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  .** locks, the c
60f0: 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64  lose is deferred
6100: 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73   until all locks
6110: 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67   clear by adding
6120: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
6130: 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c  criptor to be cl
6140: 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64  osed to the pend
6150: 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ing list..**.** 
6160: 54 4f 44 4f 3a 20 20 43 6f 6e 73 69 64 65 72 20  TODO:  Consider 
6170: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 73 6f  changing this so
6180: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6f   that there is o
6190: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  nly a single fil
61a0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
61b0: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 20 66 69  for each open fi
61c0: 6c 65 2c 20 65 76 65 6e 20 77 68 65 6e 20 69 74  le, even when it
61d0: 20 69 73 20 6f 70 65 6e 65 64 20 6d 75 6c 74 69   is opened multi
61e0: 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a 20 54 68  ple times..** Th
61f0: 65 20 63 6c 6f 73 65 28 29 20 73 79 73 74 65 6d  e close() system
6200: 20 63 61 6c 6c 20 77 6f 75 6c 64 20 6f 6e 6c 79   call would only
6210: 20 6f 63 63 75 72 20 77 68 65 6e 20 74 68 65 20   occur when the 
6220: 6c 61 73 74 20 64 61 74 61 62 61 73 65 0a 2a 2a  last database.**
6230: 20 75 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20   using the file 
6240: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  closes..*/.struc
6250: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 7b 0a  t unixOpenCnt {.
6260: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
6270: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 2f 2a  eId fileId;   /*
6280: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
6290: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
62c0: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
62d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
62e0: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
62f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6300: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
6310: 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e  ng locks */.  in
6320: 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  t nPending;     
6330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6340: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 63  ber of pending c
6350: 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  lose() operation
6360: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e  s */.  int *aPen
6370: 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  ding;           
6380: 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61   /* Malloced spa
6390: 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73 20  ce holding fd's 
63a0: 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73 65  awaiting a close
63b0: 28 29 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  () */.#if OS_VXW
63c0: 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53  ORKS.  sem_t *pS
63d0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
63e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
63f0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
6400: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
6410: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
6420: 2b 31 5d 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  +1];   /* Name o
6430: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
6440: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72   */.#endif.  str
6450: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
6460: 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20  *pNext, *pPrev; 
6470: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
6480: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a   unixOpenCnt obj
6490: 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ects */.};../*.*
64a0: 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  * Lists of all u
64b0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  nixLockInfo and 
64c0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65  unixOpenCnt obje
64d0: 63 74 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  cts.  These used
64e0: 20 74 6f 20 62 65 20 68 61 73 68 0a 2a 2a 20 74   to be hash.** t
64f0: 61 62 6c 65 73 2e 20 20 42 75 74 20 74 68 65 20  ables.  But the 
6500: 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
6510: 73 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  s is rarely more
6520: 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e 20 61 6e   than a dozen an
6530: 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78 63 65 65  d.** never excee
6540: 64 73 20 61 20 66 65 77 20 74 68 6f 75 73 61 6e  ds a few thousan
6550: 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75 70 20 69  d.  And lookup i
6560: 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72 69 74 69  s not on a criti
6570: 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73 6f 20 61  cal.** path so a
6580: 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65 64 20 6c   simple linked l
6590: 69 73 74 20 77 69 6c 6c 20 73 75 66 66 69 63 65  ist will suffice
65a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
65b0: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
65c0: 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a 73  *lockList = 0;.s
65d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
65e0: 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69  xOpenCnt *openLi
65f0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  st = 0;../*.** T
6600: 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65 6d  his variable rem
6610: 65 6d 62 65 72 73 20 77 68 65 74 68 65 72 20 6f  embers whether o
6620: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
6630: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
6640: 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e  others.** locks.
6650: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f  .**.**    0:  No
6660: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f  .  Threads canno
6670: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
6680: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28  others locks.  (
6690: 4c 69 6e 75 78 54 68 72 65 61 64 73 29 0a 2a 2a  LinuxThreads).**
66a0: 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68      1:  Yes.  Th
66b0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
66c0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
66d0: 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78 20 26 20  ocks.  (Posix & 
66e0: 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31 3a 20 20  NLPT).**   -1:  
66f0: 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65  We don't know ye
6700: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  t..**.** On some
6710: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f   systems, we kno
6720: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
6730: 65 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e  e if threads can
6740: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a   override each.*
6750: 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20  * others locks. 
6760: 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   On those system
6770: 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48  s, the SQLITE_TH
6780: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
6790: 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c  CK macro.** will
67a0: 20 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69   be set appropri
67b0: 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72  ately.  On other
67c0: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76   systems, we hav
67d0: 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a  e to check at.**
67e0: 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68   runtime.  On th
67f0: 65 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65  ese latter syste
6800: 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41  ms, SQLTIE_THREA
6810: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20  D_OVERRIDE_LOCK 
6820: 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e  is.** undefined.
6830: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  .**.** This vari
6840: 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61  able normally ha
6850: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c  s file scope onl
6860: 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74  y.  But during t
6870: 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a  esting, we make.
6880: 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73  ** it a global s
6890: 6f 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  o that the test 
68a0: 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20  code can change 
68b0: 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64  its value in ord
68c0: 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20  er to verify.** 
68d0: 74 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73  that the right s
68e0: 74 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20  tuff happens in 
68f0: 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a  either case..*/.
6900: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
6910: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
6920: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 20 69  (__linux__).#  i
6930: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48 52  fndef SQLITE_THR
6940: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
6950: 4b 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  K.#    define SQ
6960: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
6970: 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 20 20  RIDE_LOCK -1.#  
6980: 65 6e 64 69 66 0a 23 20 20 69 66 64 65 66 20 53  endif.#  ifdef S
6990: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74  QLITE_TEST.int t
69a0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
69b0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
69c0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
69d0: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20  ERRIDE_LOCK;.#  
69e0: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
69f0: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
6a00: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
6a10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6a20: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20  VERRIDE_LOCK;.# 
6a30: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
6a40: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
6a50: 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d  ure holds inform
6a60: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74  ation passed int
6a70: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73  o individual tes
6a80: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20  t.** threads by 
6a90: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
6aa0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
6ab0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
6ac0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
6ad0: 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  a {.  int fd;   
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6af0: 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  File to be locke
6b00: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  d */.  struct fl
6b10: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a  ock lock;     /*
6b20: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   The locking ope
6b30: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
6b40: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
6b50: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
6b60: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  the locking oper
6b70: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ation */.};..#if
6b80: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
6b90: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
6ba0: 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54  linux__)./*.** T
6bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6bc0: 75 73 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e  used as the main
6bd0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 74   routine for a t
6be0: 68 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20 62  hread launched b
6bf0: 79 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64 4c  y.** testThreadL
6c00: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
6c10: 2e 20 49 74 20 74 65 73 74 73 20 77 68 65 74 68  . It tests wheth
6c20: 65 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c 6f  er the shared-lo
6c30: 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 62  ck obtained.** b
6c40: 79 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61  y the main threa
6c50: 64 20 69 6e 20 74 65 73 74 54 68 72 65 61 64 4c  d in testThreadL
6c60: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
6c70: 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
6c80: 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63 61  a.** hypothetica
6c90: 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62 74  l write-lock obt
6ca0: 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 74 68  ained by this th
6cb0: 72 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  read on the same
6cc0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
6cd0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
6ce0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71 75  ot actually acqu
6cf0: 69 72 65 64 2c 20 61 73 20 74 68 69 73 20 69 73  ired, as this is
6d00: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66   not possible if
6d10: 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73   .** the file is
6d20: 20 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f 6e   open in read-on
6d30: 6c 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69 63  ly mode (see tic
6d40: 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20 0a  ket #3472)..*/ .
6d50: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72  static void *thr
6d60: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76  eadLockingTest(v
6d70: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74  oid *pArg){.  st
6d80: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
6d90: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74  ata *pData = (st
6da0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
6db0: 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61  ata*)pArg;.  pDa
6dc0: 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e  ta->result = fcn
6dd0: 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f  tl(pData->fd, F_
6de0: 47 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c  GETLK, &pData->l
6df0: 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ock);.  return p
6e00: 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Arg;.}.#endif /*
6e10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
6e20: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
6e30: 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 0a 23 69  linux__) */...#i
6e40: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
6e50: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
6e60: 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _linux__)./*.** 
6e70: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61  This procedure a
6e80: 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
6e90: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6ea0: 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63  not threads.** c
6eb0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
6ec0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68   others locks th
6ed0: 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20  en sets the .** 
6ee0: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
6ef0: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76  achOthersLocks v
6f00: 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69  ariable appropri
6f10: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6f20: 20 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64   void testThread
6f30: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
6f40: 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20  int fd_orig){.  
6f50: 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 63  int fd;.  int rc
6f60: 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61  ;.  struct threa
6f70: 64 54 65 73 74 44 61 74 61 20 64 3b 0a 20 20 73  dTestData d;.  s
6f80: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20  truct flock l;. 
6f90: 20 70 74 68 72 65 61 64 5f 74 20 74 3b 0a 0a 20   pthread_t t;.. 
6fa0: 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69   fd = dup(fd_ori
6fb0: 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  g);.  if( fd<0 )
6fc0: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
6fd0: 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&l, 0, sizeof(
6fe0: 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65 20  l));.  l.l_type 
6ff0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c  = F_RDLCK;.  l.l
7000: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f  _len = 1;.  l.l_
7010: 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c  start = 0;.  l.l
7020: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
7030: 45 54 3b 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c  ET;.  rc = fcntl
7040: 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53 45 54 4c  (fd_orig, F_SETL
7050: 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28 20 72 63  K, &l);.  if( rc
7060: 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  !=0 ) return;.  
7070: 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c 20 73 69  memset(&d, 0, si
7080: 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 2e 66 64  zeof(d));.  d.fd
7090: 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20   = fd;.  d.lock 
70a0: 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f  = l;.  d.lock.l_
70b0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
70c0: 20 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65    pthread_create
70d0: 28 26 74 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  (&t, 0, threadLo
70e0: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 29 3b 0a  ckingTest, &d);.
70f0: 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74    pthread_join(t
7100: 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64  , 0);.  close(fd
7110: 29 3b 0a 20 20 69 66 28 20 64 2e 72 65 73 75 6c  );.  if( d.resul
7120: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t!=0 ) return;. 
7130: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
7140: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
7150: 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  = (d.lock.l_type
7160: 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65  ==F_UNLCK);.}.#e
7170: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7180: 48 45 52 41 44 53 41 46 45 20 26 26 20 64 65 66  HERADSAFE && def
7190: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
71a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  */../*.** Releas
71b0: 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  e a unixLockInfo
71c0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
71d0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
71e0: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
71f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
7200: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
7210: 6f 28 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63  o(struct unixLoc
7220: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20  kInfo *pLock){. 
7230: 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20   if( pLock ){.  
7240: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b    pLock->nRef--;
7250: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
7260: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
7270: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65   if( pLock->pPre
7280: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
7290: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65  ert( pLock->pPre
72a0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20  v->pNext==pLock 
72b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  );.        pLock
72c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
72d0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
72e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
72f0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
7300: 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  List==pLock );. 
7310: 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20         lockList 
7320: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
7330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7340: 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29  ( pLock->pNext )
7350: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7360: 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e  ( pLock->pNext->
7370: 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pPrev==pLock );.
7380: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
7390: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Next->pPrev = pL
73a0: 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ock->pPrev;.    
73b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
73c0: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
73d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
73e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
73f0: 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  OpenCnt structur
7400: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  e previously all
7410: 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f  ocated by findLo
7420: 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61  ckInfo()..*/.sta
7430: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
7440: 4f 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 75  OpenCnt(struct u
7450: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
7460: 6e 29 7b 0a 20 20 69 66 28 20 70 4f 70 65 6e 20  n){.  if( pOpen 
7470: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  ){.    pOpen->nR
7480: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f  ef--;.    if( pO
7490: 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pen->nRef==0 ){.
74a0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
74b0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
74c0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
74d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
74e0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
74f0: 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e  pOpen->pPrev->pN
7500: 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65  ext = pOpen->pNe
7510: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
7520: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7530: 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e   openList==pOpen
7540: 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   );.        open
7550: 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  List = pOpen->pN
7560: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
7570: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e     if( pOpen->pN
7580: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
7590: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e  ssert( pOpen->pN
75a0: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65  ext->pPrev==pOpe
75b0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  n );.        pOp
75c0: 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  en->pNext->pPrev
75d0: 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b   = pOpen->pPrev;
75e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
75f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
7600: 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20  n->aPending);.  
7610: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7620: 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  (pOpen);.    }. 
7630: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
7640: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
7650: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78  tor, locate unix
7660: 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69  LockInfo and uni
7670: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75  xOpenCnt structu
7680: 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  res that.** desc
7690: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
76a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
76b0: 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20  ate new ones if 
76c0: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
76d0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ** return values
76e0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
76f0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
7700: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
7710: 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72  * Return an appr
7720: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
7730: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
7740: 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a  t findLockInfo(.
7750: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
7760: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7770: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
7780: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
7790: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
77a0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
77b0: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
77c0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
77d0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
77e0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
77f0: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
7800: 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 2f  nt **ppOpen    /
7810: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
7820: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75  xOpenCnt structu
7830: 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  re here */.){.  
7840: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
7870: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
7880: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78a0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
78b0: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
78c0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  /.  struct unixL
78d0: 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20  ockKey lockKey; 
78e0: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
78f0: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4c 6f 63   for the unixLoc
7900: 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  kInfo structure 
7910: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
7920: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
7930: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
7940: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4f 70  y for the unixOp
7950: 65 6e 43 6e 74 20 73 74 72 75 63 74 20 2a 2f 0a  enCnt struct */.
7960: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
7970: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
7980: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
7990: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
79a0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  /.  struct unixL
79b0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20  ockInfo *pLock; 
79c0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
79d0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a  unixLockInfo obj
79e0: 65 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ect */.  struct 
79f0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
7a00: 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69  en;     /* Candi
7a10: 64 61 74 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74  date unixOpenCnt
7a20: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a   object */..  /*
7a30: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
7a40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
7a50: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
7a60: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
7a70: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
7a80: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
7a90: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
7aa0: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
7ab0: 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74   = fstat(fd, &st
7ac0: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
7ad0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  !=0 ){.    pFile
7ae0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
7af0: 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45  rno;.#ifdef EOVE
7b00: 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46  RFLOW.    if( pF
7b10: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
7b20: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
7b30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
7b40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
7b50: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
7b60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 20 4f 53  .  }..  /* On OS
7b70: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
7b80: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
7b90: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
7ba0: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
7bb0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
7bc0: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
7bd0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
7be0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
7bf0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
7c00: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
7c10: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
7c20: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
7c30: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
7c40: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
7c50: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
7c60: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
7c70: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
7c80: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
7c90: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
7ca0: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
7cb0: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
7cc0: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
7cd0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
7ce0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
7cf0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
7d00: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
7d10: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
7d20: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
7d30: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
7d40: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
7d50: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
7d60: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
7d70: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
7d80: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
7d90: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
7da0: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
7db0: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
7dc0: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
7dd0: 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  st_size==0 ){.  
7de0: 20 20 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c    write(fd, "S",
7df0: 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 73   1);.    rc = fs
7e00: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
7e10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
7e20: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
7e30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
7e40: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
7e50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7e60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73     }.  }..  mems
7e70: 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20 30 2c 20  et(&lockKey, 0, 
7e80: 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29  sizeof(lockKey))
7e90: 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  ;.  lockKey.fid.
7ea0: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
7eb0: 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57  _dev;.#if OS_VXW
7ec0: 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  ORKS.  lockKey.f
7ed0: 69 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  id.pId = pFile->
7ee0: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 6c 6f 63  pId;.#else.  loc
7ef0: 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20 3d 20 73  kKey.fid.ino = s
7f00: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
7f10: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
7f20: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
7f30: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
7f40: 29 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f  ).  if( threadsO
7f50: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
7f60: 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20  sLocks<0 ){.    
7f70: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
7f80: 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a 20  gBehavior(fd);. 
7f90: 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e 74 69 64   }.  lockKey.tid
7fa0: 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69   = threadsOverri
7fb0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7fc0: 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f  s ? 0 : pthread_
7fd0: 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20  self();.#endif. 
7fe0: 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63 6b 4b 65   fileId = lockKe
7ff0: 79 2e 66 69 64 3b 0a 20 20 69 66 28 20 70 70 4c  y.fid;.  if( ppL
8000: 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ock!=0 ){.    pL
8010: 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a  ock = lockList;.
8020: 20 20 20 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b      while( pLock
8030: 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c 6f 63 6b   && memcmp(&lock
8040: 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e 6c 6f 63  Key, &pLock->loc
8050: 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28 6c 6f 63  kKey, sizeof(loc
8060: 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20 20 20 20  kKey)) ){.      
8070: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pLock = pLock->p
8080: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
8090: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
80a0: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71        pLock = sq
80b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
80c0: 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a  zeof(*pLock) );.
80d0: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d        if( pLock=
80e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
80f0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8100: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
8110: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
8120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8130: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 20 3d 20  Lock->lockKey = 
8140: 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20 20 20 20 70  lockKey;.      p
8150: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
8160: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
8170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63   = 0;.      pLoc
8180: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b  k->locktype = 0;
8190: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  .      pLock->pN
81a0: 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a  ext = lockList;.
81b0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72        pLock->pPr
81c0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ev = 0;.      if
81d0: 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c 6f 63  ( lockList ) loc
81e0: 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  kList->pPrev = p
81f0: 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  Lock;.      lock
8200: 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  List = pLock;.  
8210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
8220: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
8230: 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20    }.    *ppLock 
8240: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  = pLock;.  }.  i
8250: 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b 0a  f( ppOpen!=0 ){.
8260: 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70 65 6e      pOpen = open
8270: 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
8280: 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63 6d 70   pOpen && memcmp
8290: 28 26 66 69 6c 65 49 64 2c 20 26 70 4f 70 65 6e  (&fileId, &pOpen
82a0: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
82b0: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
82c0: 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e     pOpen = pOpen
82d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
82e0: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
82f0: 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d  ){.      pOpen =
8300: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8310: 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20   sizeof(*pOpen) 
8320: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
8330: 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
8340: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
8350: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  (pLock);.       
8360: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8370: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8380: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
8390: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
83a0: 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 20    pOpen->fileId 
83b0: 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20 20 20 20  = fileId;.      
83c0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b  pOpen->nRef = 1;
83d0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
83e0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ock = 0;.      p
83f0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
8400: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
8410: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
8420: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78       pOpen->pNex
8430: 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20  t = openList;.  
8440: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76      pOpen->pPrev
8450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8460: 6f 70 65 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c  openList ) openL
8470: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70  ist->pPrev = pOp
8480: 65 6e 3b 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69  en;.      openLi
8490: 73 74 20 3d 20 70 4f 70 65 6e 3b 0a 23 69 66 20  st = pOpen;.#if 
84a0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
84b0: 20 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 4e   pOpen->pSem = N
84c0: 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ULL;.      pOpen
84d0: 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
84e0: 27 5c 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20  '\0';.#endif.   
84f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
8500: 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pen->nRef++;.   
8510: 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d   }.    *ppOpen =
8520: 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69   pOpen;.  }..exi
8530: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a  t_findlockinfo:.
8540: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8550: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
8560: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 64  currently in a d
8570: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
8580: 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64 20  than the thread 
8590: 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78  that the.** unix
85a0: 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62 65  File argument be
85b0: 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20 74  longs to, then t
85c0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
85d0: 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  p of the unixFil
85e0: 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68 65  e.** over to the
85f0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
8600: 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c  .**.** A unixFil
8610: 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20  e is only owned 
8620: 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20 73  by a thread on s
8630: 79 73 74 65 6d 73 20 74 68 61 74 20 75 73 65 20  ystems that use 
8640: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2a  LinuxThreads..**
8650: 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72  .** Ownership tr
8660: 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20 61  ansfer is only a
8670: 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75 6e  llowed if the un
8680: 69 78 46 69 6c 65 20 69 73 20 63 75 72 72 65 6e  ixFile is curren
8690: 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a  tly unlocked..**
86a0: 20 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   If the unixFile
86b0: 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61   is locked and a
86c0: 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20 77  n ownership is w
86d0: 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75 72  rong, then retur
86e0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55  n.** SQLITE_MISU
86f0: 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69  SE.  SQLITE_OK i
8700: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
8710: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a  erything works..
8720: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
8730: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
8740: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73  ned(__linux__).s
8750: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66  tatic int transf
8760: 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78  erOwnership(unix
8770: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
8780: 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
8790: 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28  d_t hSelf;.  if(
87a0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
87b0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
87c0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73  ){.    /* Owners
87d0: 68 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f  hip transfers no
87e0: 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73  t needed on this
87f0: 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72   system */.    r
8800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8810: 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70  .  }.  hSelf = p
8820: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
8830: 20 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75   if( pthread_equ
8840: 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68  al(pFile->tid, h
8850: 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Self) ){.    /* 
8860: 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  We are still in 
8870: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20  the same thread 
8880: 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28  */.    OSTRACE1(
8890: 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61  "No-transfer, sa
88a0: 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20  me thread\n");. 
88b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
88c0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
88d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
88e0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
88f0: 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e  * We cannot chan
8900: 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69  ge ownership whi
8910: 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  le we are holdin
8920: 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20  g a lock! */.   
8930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
8940: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54  ISUSE;.  }.  OST
8950: 52 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20  RACE4("Transfer 
8960: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20  ownership of %d 
8970: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
8980: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ,.            pF
8990: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74  ile->h, pFile->t
89a0: 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46  id, hSelf);.  pF
89b0: 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66  ile->tid = hSelf
89c0: 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70  ;.  if (pFile->p
89d0: 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Lock != NULL) {.
89e0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
89f0: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
8a00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
8a10: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2c 20  LockInfo(pFile, 
8a20: 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30  &pFile->pLock, 0
8a30: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35 28  );.    OSTRACE5(
8a40: 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20 6e  "LOCK    %d is n
8a50: 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c  ow %s(%s,%d)\n",
8a60: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
8a70: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
8a80: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
8a90: 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe),.           
8aa0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
8ab0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
8ac0: 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  ype), pFile->pLo
8ad0: 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65  ck->cnt);.    re
8ae0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
8af0: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
8b00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
8b10: 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e 6f 74  #else  /* if not
8b20: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8b30: 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20 73 69  FE */.  /* On si
8b40: 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75  ngle-threaded bu
8b50: 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70 20  ilds, ownership 
8b60: 74 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e 6f  transfer is a no
8b70: 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -op */.# define 
8b80: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
8b90: 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  p(X) SQLITE_OK.#
8ba0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8bb0: 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 0a 0a  THREADSAFE */...
8bc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8bd0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
8be0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
8bf0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
8c00: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
8c10: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
8c20: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
8c30: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
8c40: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
8c50: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
8c60: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
8c70: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
8c80: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
8c90: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
8ca0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
8cb0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
8cc0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
8cd0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
8ce0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
8cf0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
8d00: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
8d10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
8d20: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
8d30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8d40: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
8d50: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
8d60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
8d70: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
8d80: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8d90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8da0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8db0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
8dc0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
8dd0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
8de0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
8df0: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
8e00: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
8e10: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
8e20: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
8e30: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
8e40: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
8e50: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
8e60: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
8e70: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
8e80: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
8e90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
8ea0: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
8eb0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
8ec0: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20  holds it..  */. 
8ed0: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
8ee0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
8ef0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
8f00: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
8f10: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
8f20: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
8f30: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
8f40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
8f50: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
8f60: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28  _WRLCK;.    if (
8f70: 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c  -1 == fcntl(pFil
8f80: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
8f90: 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69  lock)) {.      i
8fa0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
8fb0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
8fc0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
8fd0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
8fe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
8ff0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
9000: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
9010: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
9020: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
9030: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
9040: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
9050: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
9060: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
9070: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9080: 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
9090: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
90a0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
90b0: 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20  , reserved);..  
90c0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
90d0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
90e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
90f0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
9100: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
9110: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
9120: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
9130: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9140: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
9150: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
9160: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
9170: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
9180: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
9190: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
91a0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
91b0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
91c0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
91d0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
91e0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
91f0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
9200: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
9210: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
9220: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
9230: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
9240: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
9250: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
9260: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
9270: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
9280: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
9290: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
92b0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
92c0: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
92d0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
92e0: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
92f0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
9300: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
9310: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
9320: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
9330: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
9340: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
9350: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
9360: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
9370: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
9380: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
9390: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
93a0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
93b0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
93c0: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
93d0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
93e0: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
93f0: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
9400: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
9410: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
9420: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
9430: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f  t locktype){.  /
9440: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9450: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
9460: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
9470: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
9480: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
9490: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
94a0: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
94b0: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
94c0: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
94d0: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
94e0: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
94f0: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
9500: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
9510: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
9520: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
9530: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
9540: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
9550: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
9560: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
9570: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
9580: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
9590: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
95a0: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
95b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
95c0: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
95d0: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
95e0: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
95f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
9600: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
9610: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
9620: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
9630: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
9640: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
9650: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
9660: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
9670: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
9680: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9690: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
96a0: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
96b0: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
96c0: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
96d0: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
96e0: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
96f0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
9700: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9710: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
9720: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
9730: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
9740: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
9750: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
9760: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
9770: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
9780: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9790: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
97a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
97b0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
97c0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
97d0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
97e0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
97f0: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
9800: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
9810: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
9820: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
9830: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
9840: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
9850: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
9860: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
9870: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
9880: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
9890: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
98a0: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
98b0: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
98c0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
98d0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
98e0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
98f0: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
9900: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
9910: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
9920: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
9930: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
9940: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
9950: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
9960: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
9970: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
9980: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
9990: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
99a0: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
99b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
99c0: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
99d0: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
99e0: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
99f0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
9a00: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
9a10: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
9a20: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
9a30: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
9a40: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
9a50: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
9a60: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
9a70: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
9a80: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
9a90: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
9aa0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
9ab0: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
9ac0: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
9ad0: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
9ae0: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
9af0: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
9b00: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
9b10: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
9b20: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
9b30: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
9b40: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
9b50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
9b60: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
9b70: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
9b80: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
9b90: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9ba0: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
9bb0: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
9bc0: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
9bd0: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
9be0: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
9bf0: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
9c00: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
9c10: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
9c20: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
9c30: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
9c40: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
9c50: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
9c60: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
9c70: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
9c80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9c90: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
9ca0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
9cb0: 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  d;.  struct unix
9cc0: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  LockInfo *pLock 
9cd0: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
9ce0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
9cf0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20  ock;.  int s;.. 
9d00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9d10: 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f  ;.  OSTRACE7("LO
9d20: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
9d30: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
9d40: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
9d50: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
9d60: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
9d70: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
9d80: 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20  >locktype),.    
9d90: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
9da0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
9db0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65   pLock->cnt , ge
9dc0: 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49  tpid());..  /* I
9dd0: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
9de0: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
9df0: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
9e00: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
9e10: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
9e20: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
9e30: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
9e40: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
9e50: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
9e60: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
9e70: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
9e80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
9e90: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
9ea0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
9eb0: 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25  RACE3("LOCK    %
9ec0: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
9ed0: 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65   held)\n", pFile
9ee0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
9ef0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
9f00: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
9f10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9f20: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
9f30: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
9f40: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
9f50: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
9f60: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
9f70: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
9f80: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9f90: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9fa0: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
9fb0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
9fc0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
9fd0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
9fe0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
9ff0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
a000: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
a010: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
a020: 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
a030: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
a040: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
a050: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a060: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
a070: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
a080: 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70  hread owns the p
a090: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  File..  */.  rc 
a0a0: 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  = transferOwners
a0b0: 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  hip(pFile);.  if
a0c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a0d0: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  ){.    unixLeave
a0e0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
a0f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
a100: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
a110: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
a120: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
a130: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
a140: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
a150: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
a160: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
a170: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
a180: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
a190: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
a1a0: 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  if( (pFile->lock
a1b0: 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63  type!=pLock->loc
a1c0: 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20  ktype && .      
a1d0: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
a1e0: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
a1f0: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53  CK || locktype>S
a200: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
a210: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
a220: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
a230: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
a240: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
a250: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
a260: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
a270: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
a280: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
a290: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
a2a0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
a2b0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
a2c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
a2d0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
a2e0: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
a2f0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
a300: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
a310: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
a320: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a330: 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
a340: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
a350: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
a360: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
a370: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a380: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
a390: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
a3b0: 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
a3c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
a3d0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
a3e0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
a3f0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
a400: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
a410: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
a420: 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   }..  lock.l_len
a430: 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c   = 1L;..  lock.l
a440: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a450: 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44  ET;..  /* A PEND
a460: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
a470: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
a480: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
a490: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
a4a0: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
a4b0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
a4c0: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
a4d0: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
a4e0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
a4f0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
a500: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
a510: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
a520: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
a530: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
a540: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
a550: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
a560: 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
a570: 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d  pe = (locktype==
a580: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
a590: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
a5a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a5b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
a5c0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
a5d0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
a5e0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
a5f0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
a600: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
a610: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
a620: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
a630: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
a640: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
a650: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
a660: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
a670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
a680: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
a690: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
a6a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
a6b0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
a6c0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
a6d0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
a6e0: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
a6f0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
a700: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
a710: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
a720: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
a730: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
a740: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
a750: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
a760: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
a770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
a780: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20  ck->cnt==0 );.  
a790: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
a7a0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
a7b0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
a7c0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
a7d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a7e0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
a7f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
a800: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
a810: 20 20 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e      if( (s = fcn
a820: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a830: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28  ETLK, &lock))==(
a840: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  -1) ){.      tEr
a850: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a860: 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
a870: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
a880: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
a890: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a8a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
a8b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
a8c0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
a8d0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
a8e0: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
a8f0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
a900: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
a910: 20 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b    if( s != -1 ){
a920: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
a930: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
a940: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
a950: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45  nt */.        tE
a960: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20  rrno = errno; . 
a970: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a980: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
a990: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
a9a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
a9b0: 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  K); .        if(
a9c0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
a9d0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
a9e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a9f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
aa00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
aa10: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
aa20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
aa30: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
aa40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
aa50: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
aa60: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
aa70: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
aa80: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
aa90: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
aaa0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
aab0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
aad0: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
aae0: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
aaf0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  D_LOCK;.      pF
ab00: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
ab10: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  k++;.      pLock
ab20: 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ->cnt = 1;.    }
ab30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
ab40: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
ab50: 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e  _LOCK && pLock->
ab60: 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  cnt>1 ){.    /* 
ab70: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
ab80: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
ab90: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
aba0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
abb0: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
abc0: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
abd0: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
abe0: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
abf0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
ac00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ac10: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
ac20: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
ac30: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
ac40: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
ac50: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
ac60: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
ac70: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
ac80: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
ac90: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
aca0: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
acb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
acc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
acd0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73  = F_WRLCK;.    s
ace0: 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20  witch( locktype 
acf0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45  ){.      case RE
ad00: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20  SERVED_LOCK:.   
ad10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ad20: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
ad30: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
ad40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43  ;.      case EXC
ad50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20  LUSIVE_LOCK:.   
ad60: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ad70: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
ad80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ad90: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ada0: 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ZE;.        brea
adb0: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
adc0: 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
add0: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
ade0: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
adf0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ae00: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28  k);.    if( s==(
ae10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  -1) ){.      int
ae20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ae30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ae40: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
ae50: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ae60: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
ae70: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
ae80: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ae90: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
aea0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
aeb0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
aec0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
aed0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
aee0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
aef0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
af00: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
af10: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
af20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
af30: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
af40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
af50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  e->locktype = PE
af60: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
af70: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
af80: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
af90: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
afa0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
afb0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
afc0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
afd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
afe0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
aff0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
b000: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
b010: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
b020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b030: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
b040: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
b050: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b060: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
b070: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
b080: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b090: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b0a0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b0b0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b0c0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b0d0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b0e0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b0f0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b100: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b110: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b120: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b130: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
b140: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
b150: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
b160: 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
b170: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
b180: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
b190: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
b1a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
b1b0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b1c0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b1d0: 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72   int h;..  asser
b1e0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
b1f0: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
b200: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
b210: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
b220: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
b230: 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e,.      pFile->
b240: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
b250: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
b260: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
b270: 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  cnt, getpid());.
b280: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
b290: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
b2a0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
b2b0: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
b2c0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
b2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b2e0: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
b2f0: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
b300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b310: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
b320: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
b330: 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  ;.  h = pFile->h
b340: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  ;.  pLock = pFil
b350: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65  e->pLock;.  asse
b360: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d  rt( pLock->cnt!=
b370: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
b380: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
b390: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
b3a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
b3b0: 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f  ktype==pFile->lo
b3c0: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69  cktype );.    Si
b3d0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b3e0: 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
b3f0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
b400: 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
b410: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
b420: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
b430: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b440: 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  K ){.      lock.
b450: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
b460: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
b470: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b480: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
b490: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
b4a0: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
b4b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
b4c0: 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66  IZE;.      if( f
b4d0: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
b4e0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
b4f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
b500: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
b510: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b520: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b530: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b540: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
b550: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
b560: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
b570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
b580: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b590: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
b5a0: 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75  }.....goto end_u
b5b0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  nlock;.      }. 
b5c0: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
b5d0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
b5e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
b5f0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
b600: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b610: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
b620: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b630: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
b640: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
b650: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
b660: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
b670: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
b680: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c  (-1) ){.      pL
b690: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
b6a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
b6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
b6c0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
b6d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b6e0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b6f0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b700: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b710: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
b720: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b730: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
b740: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b750: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 09  Errno;.      }..
b760: 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63  ..goto end_unloc
b770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
b780: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
b790: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75  LOCK ){.    stru
b7a0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
b7b0: 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44  pOpen;..    /* D
b7c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
b7d0: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
b7e0: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
b7f0: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
b800: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
b810: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
b820: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
b830: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
b840: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
b850: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
b860: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
b870: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
b880: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  t==0 ){.      lo
b890: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
b8a0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
b8b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b8c0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
b8d0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
b8e0: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
b8f0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b900: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
b910: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b920: 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
b930: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b940: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
b950: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
b960: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
b970: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  -1) ){.        p
b980: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
b990: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
b9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
b9b0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
b9c0: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
b9d0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b9e0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b9f0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
ba00: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
ba10: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ba20: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ba30: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ba40: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ba50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ba60: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a  pLock->cnt = 1;.
ba70: 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c  ....goto end_unl
ba80: 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ock;.      }.   
ba90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
baa0: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
bab0: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
bac0: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
bad0: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
bae0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
baf0: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
bb00: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
bb10: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
bb20: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
bb30: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
bb40: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
bb50: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ks..    */.    i
bb60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bb70: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20   ){.      pOpen 
bb80: 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
bb90: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f        pOpen->nLo
bba0: 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
bbb0: 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  rt( pOpen->nLock
bbc0: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
bbd0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30   pOpen->nLock==0
bbe0: 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64   && pOpen->nPend
bbf0: 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ing>0 ){.       
bc00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
bc10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e  for(i=0; i<pOpen
bc20: 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29  ->nPending; i++)
bc30: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
bc40: 6c 6f 73 65 20 70 65 6e 64 69 6e 67 20 66 64 73  lose pending fds
bc50: 2c 20 62 75 74 20 69 66 20 63 6c 6f 73 69 6e 67  , but if closing
bc60: 20 66 61 69 6c 73 20 64 6f 6e 27 74 20 66 72 65   fails don't fre
bc70: 65 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20  e the array.    
bc80: 20 20 20 20 20 20 2a 2a 20 61 73 73 69 67 6e 20        ** assign 
bc90: 2d 31 20 74 6f 20 74 68 65 20 73 75 63 63 65 73  -1 to the succes
bca0: 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 64 65  sfully closed de
bcb0: 73 63 72 69 70 74 6f 72 73 20 61 6e 64 20 72 65  scriptors and re
bcc0: 63 6f 72 64 20 74 68 65 0a 20 20 20 20 20 20 20  cord the.       
bcd0: 20 20 20 2a 2a 20 65 72 72 6f 72 2e 20 20 54 68     ** error.  Th
bce0: 65 20 6e 65 78 74 20 61 74 74 65 6d 70 74 20 74  e next attempt t
bcf0: 6f 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 74 72  o unlock will tr
bd00: 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  y again. */.    
bd10: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
bd20: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30  >aPending[i] < 0
bd30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bd40: 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
bd50: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
bd60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
bd70: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bd80: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bd90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
bda0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
bdb0: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
bdc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bdd0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
bde0: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  i] = -1;.       
bdf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
be00: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
be10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
be30: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
be40: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ng);.          p
be50: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
be60: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   0;.          pO
be70: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
be80: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
be90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09     }.    }.  }..
bea0: 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
beb0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
bec0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bed0: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
bee0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
bef0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
bf00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
bf10: 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
bf20: 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
bf30: 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
bf40: 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
bf50: 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
bf60: 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
bf70: 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
bf80: 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
bf90: 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
bfa0: 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
bfb0: 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
bfc0: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
bfd0: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
bfe0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
bff0: 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
c000: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
c010: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
c020: 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
c030: 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
c040: 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
c050: 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
c060: 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
c070: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
c080: 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
c090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
c0a0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
c0b0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
c0c0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
c0d0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
c0e0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b  ;.  if( pFile ){
c0f0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
c100: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
c110: 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73    int err = clos
c120: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
c130: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
c140: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c150: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
c160: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
c170: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
c180: 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  DIR_CLOSE;.     
c190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c1a0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b  pFile->dirfd=-1;
c1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c1c0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
c1d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c1e0: 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
c1f0: 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28  e->h);.      if(
c200: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
c210: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c220: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c240: 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  IOERR_CLOSE;.   
c250: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f     }.    }.#if O
c260: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66  S_VXWORKS.    if
c270: 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a  ( pFile->pId ){.
c280: 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
c290: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
c2a0: 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c       unlink(pFil
c2b0: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
c2c0: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  alName);.      }
c2d0: 0a 20 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65  .      vxworksRe
c2e0: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
c2f0: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70  e->pId);.      p
c300: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
c310: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c320: 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  OSTRACE2("CLOSE 
c330: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
c340: 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  ->h);.    OpenCo
c350: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 6d  unter(-1);.    m
c360: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
c370: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
c380: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c3a0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
c3b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c3c0: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
c3d0: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
c3e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c3f0: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
c400: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
c410: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
c420: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
c430: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
c440: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
c450: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
c460: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20  pFile->pOpen && 
c470: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
c480: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
c490: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
c4a0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
c4b0: 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
c4c0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
c4d0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
c4e0: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
c4f0: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
c500: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
c510: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
c520: 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
c530: 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  r to pOpen->aPen
c540: 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
c550: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
c560: 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
c570: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
c580: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
c590: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
c5a0: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 73  t *aNew;.      s
c5b0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
c5c0: 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
c5d0: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61  ->pOpen;.      a
c5e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
c5f0: 61 6c 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65  alloc(pOpen->aPe
c600: 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e  nding, (pOpen->n
c610: 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f  Pending+1)*sizeo
c620: 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 20 20  f(int) );.      
c630: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
c640: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d         /* If a m
c650: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73  alloc fails, jus
c660: 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  t leak the file 
c670: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
c680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c690: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
c6a0: 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ng = aNew;.     
c6b0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
c6c0: 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  ng[pOpen->nPendi
c6d0: 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ng] = pFile->h;.
c6e0: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e          pOpen->n
c6f0: 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20  Pending++;.     
c700: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
c710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c720: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
c730: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
c740: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
c750: 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70  enCnt(pFile->pOp
c760: 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  en);.    rc = cl
c770: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
c780: 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
c790: 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
c7a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
c7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
c7c0: 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
c7d0: 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
c7e0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
c7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
c800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
c850: 2a 2a 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 0a 2a 2a 2a 2a  ***********.****
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
c8c0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 0a 2a 2a 0a 2a  ***********.**.*
c8f0: 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
c900: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
c910: 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
c920: 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
c930: 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
c940: 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
c950: 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
c960: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
c970: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
c980: 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
c990: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
c9b0: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
c9c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
c9d0: 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
c9e0: 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
c9f0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
ca00: 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
ca10: 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
ca20: 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
ca30: 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
ca40: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
ca50: 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
ca60: 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
ca70: 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
ca80: 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
ca90: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
caa0: 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
cab0: 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
cac0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
cad0: 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
cae0: 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
caf0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
cb00: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
cb10: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
cb20: 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
cb30: 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
cb40: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
cb50: 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
cb60: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
cb70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
cb80: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
cb90: 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
cba0: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
cbb0: 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
cbc0: 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
cbd0: 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
cbe0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
cbf0: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
cc00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
cc10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cc20: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
cc30: 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
cc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc50: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
cc60: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
cc70: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
cc80: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
cc90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
cca0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
ccb0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
ccc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
ccd0: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
cce0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
ccf0: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
cd00: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
cd10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
cd20: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
cd30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cd40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cd50: 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
cd60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
cd70: 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
cd80: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
cd90: 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
cda0: 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
cdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdc0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
cdd0: 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
cde0: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
cdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
ce00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
ce50: 2a 2a 2a 2a 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 0a 2a 2a  *************.**
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ceb0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
cec0: 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
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 0a 2a 2a  *************.**
cef0: 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
cf00: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
cf10: 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
cf20: 65 78 69 73 74 69 6e 67 20 6f 66 20 73 65 70 61  existing of sepa
cf30: 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
cf40: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  es in order to c
cf50: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
cf60: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
cf70: 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75  This works on ju
cf80: 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72  st.** about ever
cf90: 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
cfa0: 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
cfb0: 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
cfc0: 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
cfd0: 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
cfe0: 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
cff0: 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
d000: 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
d010: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
d020: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
d030: 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
d040: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
d050: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
d060: 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
d070: 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
d080: 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
d090: 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
d0a0: 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
d0b0: 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
d0c0: 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
d0d0: 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
d0e0: 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
d0f0: 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
d100: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
d110: 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
d120: 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
d130: 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
d140: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
d150: 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
d160: 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
d170: 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20  ating a file in 
d180: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
d190: 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74  ry as the.** dat
d1a0: 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74  abase and with t
d1b0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74  he same name but
d1c0: 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20   with a ".lock" 
d1d0: 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e  extension added.
d1e0: 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63  .** The existanc
d1f0: 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65  e of a lock file
d200: 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
d210: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
d220: 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74   other lock.** t
d230: 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
d240: 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
d250: 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
d260: 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
d270: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
d280: 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
d290: 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
d2a0: 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
d2b0: 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
d2c0: 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64  lock file..*/.#d
d2d0: 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
d2e0: 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
d2f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d300: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
d310: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
d320: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
d330: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
d340: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
d350: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
d360: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
d370: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
d380: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
d390: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
d3a0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
d3b0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
d3c0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
d3d0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
d3e0: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
d3f0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
d400: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
d410: 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
d420: 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
d430: 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
d440: 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
d450: 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
d460: 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
d470: 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
d480: 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
d490: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
d4a0: 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
d4b0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
d4c0: 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
d4d0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
d4e0: 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
d4f0: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
d500: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
d510: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d520: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
d530: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d540: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
d550: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
d560: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d570: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
d580: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
d5a0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
d5b0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
d5c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d5d0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
d5e0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d5f0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d600: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d610: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d620: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d630: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
d640: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
d650: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
d660: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
d670: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
d680: 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
d690: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
d6a0: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
d6b0: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
d6c0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
d6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
d6e0: 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
d6f0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
d700: 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
d710: 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
d720: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
d730: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
d740: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
d750: 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
d760: 65 64 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63  ed = access(zLoc
d770: 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20  kFile, 0)==0;.  
d780: 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45  }.  OSTRACE4("TE
d790: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
d7a0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
d7b0: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
d7c0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
d7d0: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
d7e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
d7f0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
d800: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
d810: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
d820: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
d830: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
d840: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
d850: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
d860: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
d870: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
d880: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
d890: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
d8a0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
d8b0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
d8c0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
d8d0: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
d8e0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
d8f0: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
d900: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
d910: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
d920: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
d930: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
d940: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
d950: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
d960: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
d970: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
d980: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
d990: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
d9a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
d9b0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
d9c0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
d9d0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
d9e0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
d9f0: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
da00: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
da10: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
da20: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
da30: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
da40: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
da50: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
da60: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
da70: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
da80: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
da90: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
daa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
dab0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
dac0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
dad0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
dae0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
daf0: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
db00: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
db10: 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
db20: 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
db30: 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
db40: 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
db50: 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
db60: 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
db70: 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
db80: 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
db90: 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
dba0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
dbb0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
dbc0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
dbd0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
dbe0: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
dbf0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
dc00: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
dc10: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
dc20: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
dc30: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
dc40: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
dc50: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
dc60: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
dc70: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
dc80: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
dc90: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
dca0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
dcb0: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
dcc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
dcd0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f  ->locktype > NO_
dce0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
dcf0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
dd00: 63 6b 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f  cktype;.#if !OS_
dd10: 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41  VXWORKS.    /* A
dd20: 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
dd30: 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
dd40: 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20  e old file */.  
dd50: 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69    utimes(zLockFi
dd60: 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  le, NULL);.#endi
dd70: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
dd80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
dd90: 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
dda0: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
ddb0: 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46  fd = open(zLockF
ddc0: 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43  ile,O_RDONLY|O_C
ddd0: 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30  REAT|O_EXCL,0600
dde0: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
ddf0: 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
de00: 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
de10: 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20  e file, someone 
de20: 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73 74  else may have st
de30: 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  olen the lock */
de40: 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
de50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
de60: 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
de70: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
de80: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
de90: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
dea0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
deb0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
dec0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ded0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
dee0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
def0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
df00: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
df10: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
df20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
df30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
df40: 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29   if( close(fd) )
df50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
df60: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
df70: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
df80: 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d  IOERR_CLOSE;.  }
df90: 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
dfa0: 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
dfb0: 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
dfc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
dfd0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
dfe0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dff0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e000: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e010: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e020: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
e030: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
e040: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e050: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e060: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e070: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e080: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e090: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e0a0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e0b0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e0c0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e0d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e0e0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
e0f0: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
e100: 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
e110: 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
e120: 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
e130: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
e140: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
e150: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
e160: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
e170: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e180: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
e190: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
e1a0: 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
e1b0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
e1c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
e1d0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
e1e0: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
e1f0: 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
e200: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
e210: 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  e,..   pFile->lo
e220: 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
e230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
e240: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
e250: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
e260: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
e270: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e280: 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
e290: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
e2a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e2b0: 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
e2c0: 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
e2d0: 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
e2e0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
e2f0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
e300: 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
e310: 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
e320: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
e330: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
e340: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
e350: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
e360: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
e370: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
e380: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e390: 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
e3a0: 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
e3b0: 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
e3c0: 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
e3d0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
e3e0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
e3f0: 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b  if( unlink(zLock
e400: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74  File) ){.    int
e410: 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
e420: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
e430: 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
e440: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e450: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
e460: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
e470: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e480: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  K);.    }.    if
e490: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
e4a0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
e4b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e4c0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
e4d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
e4e0: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
e4f0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
e500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e510: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
e520: 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
e530: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
e540: 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
e550: 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
e560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
e570: 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
e580: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
e590: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
e5a0: 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
e5b0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e5c0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
e5d0: 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
e5e0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
e5f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
e600: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
e610: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
e620: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
e630: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e640: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e650: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64  *** End of the d
e660: 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70  ot-file lock imp
e670: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
e6e0: 0a 2f 2a 2a 2a 2a 2a 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: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
e750: 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20  n flock Locking 
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: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  .**.** Use the f
e790: 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61  lock() system ca
e7a0: 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f  ll to do file lo
e7b0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f  cking..**.** flo
e7c0: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20  ck() locking is 
e7d0: 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f  like dot-file lo
e7e0: 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68  cking in that th
e7f0: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e  e various.** fin
e800: 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20  e-grain locking 
e810: 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64  levels supported
e820: 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63   by SQLite are c
e830: 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a  ollapsed into.**
e840: 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73   a single exclus
e850: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74  ive lock.  In ot
e860: 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45  her words, SHARE
e870: 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64  D, RESERVED, and
e880: 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  .** PENDING lock
e890: 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74  s are the same t
e8a0: 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55  hing as an EXCLU
e8b0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69  SIVE lock.  SQLi
e8c0: 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b  te.** still work
e8d0: 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68  s when you do th
e8e0: 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65  is, but concurre
e8f0: 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73  ncy is reduced s
e900: 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73  ince.** only a s
e910: 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
e920: 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  n be reading the
e930: 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74   database at a t
e940: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20  ime..**.** Omit 
e950: 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20  this section if 
e960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
e970: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74  CKING_STYLE is t
e980: 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a  urned off or if.
e990: 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72  ** compiling for
e9a0: 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66   VXWORKS..*/.#if
e9b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e9c0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
e9d0: 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a  !OS_VXWORKS../*.
e9e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e9f0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
ea00: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
ea10: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
ea20: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
ea30: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
ea40: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
ea50: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
ea60: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
ea70: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
ea80: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
ea90: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
eaa0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
eab0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
eac0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
ead0: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
eae0: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
eaf0: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
eb00: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
eb10: 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
eb20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
eb30: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
eb40: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
eb50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
eb60: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
eb70: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
eb80: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb90: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
eba0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
ebb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
ebc0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
ebd0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
ebe0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ebf0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
ec00: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
ec10: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
ec20: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
ec30: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ec40: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
ec50: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
ec60: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
ec70: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
ec80: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
ec90: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
eca0: 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
ecb0: 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74  ved ){.    /* at
ecc0: 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
ecd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
ece0: 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69   lrc = flock(pFi
ecf0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
ed00: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
ed10: 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20  f( !lrc ){.     
ed20: 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b   /* got the lock
ed30: 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20  , unlock it */. 
ed40: 20 20 20 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b       lrc = flock
ed50: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
ed60: 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
ed70: 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
ed80: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
ed90: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
eda0: 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
edb0: 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
edc0: 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
edd0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
ede0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
edf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ee00: 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  K); .        if(
ee10: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
ee20: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
ee30: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ee40: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
ee50: 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
ee60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ee70: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
ee80: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
ee90: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
eea0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
eeb0: 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
eec0: 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
eed0: 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
eee0: 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
eef0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ef00: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ef10: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
ef20: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ef30: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
ef40: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ef50: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ef60: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
ef70: 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
ef80: 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
ef90: 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
efa0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  %d %d %d\n", pFi
efb0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
efc0: 76 65 64 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ved);..#ifdef SQ
efd0: 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
efe0: 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
eff0: 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
f000: 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
f010: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
f020: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f030: 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
f040: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
f050: 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
f060: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
f070: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
f080: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
f090: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
f0a0: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
f0b0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
f0c0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
f0d0: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
f0e0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
f0f0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
f100: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
f110: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
f120: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
f130: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
f140: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
f150: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
f160: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
f170: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
f180: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
f190: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
f1a0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
f1b0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
f1c0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
f1d0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
f1e0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
f1f0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
f200: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
f210: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
f220: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
f230: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
f240: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
f250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
f260: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
f270: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
f280: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
f290: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
f2a0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
f2b0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
f2c0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
f2d0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
f2e0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
f2f0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f300: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
f310: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
f320: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f330: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
f340: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
f350: 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
f360: 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
f370: 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
f380: 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
f390: 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
f3a0: 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
f3b0: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
f3c0: 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
f3d0: 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
f3e0: 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
f3f0: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
f400: 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
f410: 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
f420: 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
f430: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
f440: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
f450: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
f460: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
f470: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
f480: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
f490: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
f4a0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
f4b0: 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
f4c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f4d0: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f4e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f4f0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
f500: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f510: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
f520: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
f530: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
f540: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
f550: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
f560: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
f570: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
f580: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
f590: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
f5a0: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
f5b0: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
f5c0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
f5d0: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
f5e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f5f0: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
f600: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
f610: 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
f620: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
f630: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
f640: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
f650: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
f660: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
f670: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
f680: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f690: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f6a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f6b0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
f6c0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f6d0: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
f6e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f6f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
f700: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
f710: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
f720: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
f730: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
f740: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
f750: 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ype;.  }.  OSTRA
f760: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
f770: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
f780: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
f790: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
f7a0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
f7b0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
f7c0: 66 61 69 6c 65 64 22 29 3b 0a 23 69 66 64 65 66  failed");.#ifdef
f7d0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
f7e0: 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
f7f0: 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
f800: 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
f810: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
f820: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f830: 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
f840: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
f850: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f860: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
f870: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
f880: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
f890: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
f8a0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
f8b0: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
f8c0: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
f8d0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
f8e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
f8f0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
f900: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
f910: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f920: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
f930: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
f940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
f950: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
f960: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
f970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
f980: 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
f990: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f9a0: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
f9b0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f9c0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f9d0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f9e0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  e );.  OSTRACE5(
f9f0: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
fa00: 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  as %d pid=%d\n",
fa10: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
fa20: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ype,.           
fa30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
fa40: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73   getpid());.  as
fa50: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
fa60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
fa70: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
fa80: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
fa90: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
faa0: 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
fab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fac0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
fad0: 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
fae0: 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
faf0: 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
fb00: 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
fb10: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
fb20: 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
fb30: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fb40: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
fb50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb60: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
fb70: 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
fb80: 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ck. */.  int rc 
fb90: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
fba0: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66  , LOCK_UN);.  if
fbb0: 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e 74 20   (rc) {.    int 
fbc0: 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  r, tErrno = errn
fbd0: 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74  o;.    r = sqlit
fbe0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
fbf0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
fc00: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
fc20: 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a 20  CK_ERROR(r) ){. 
fc30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fc40: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fc50: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
fc60: 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
fc70: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
fc80: 20 69 66 28 20 28 72 20 26 20 53 51 4c 49 54 45   if( (r & SQLITE
fc90: 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
fca0: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
fcb0: 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59   r = SQLITE_BUSY
fcc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
fcd0: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
fce0: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
fcf0: 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72 65  S */.    .    re
fd00: 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65  turn r;.  } else
fd10: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
fd20: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
fd30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fd40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
fd50: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
fd60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fd70: 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
fd80: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
fd90: 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
fda0: 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
fdb0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
fdc0: 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
fdd0: 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e  File(id);.}..#en
fde0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
fdf0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
fe00: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
fe10: 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
fe20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
fe30: 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20   the flock lock 
fe40: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
fe50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe60: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
fe70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
feb0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ff10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
ff20: 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70  egin Named Semap
ff30: 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  hore Locking ***
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff50: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65  *****.**.** Name
ff60: 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
ff70: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  ing is only supp
ff80: 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  orted on VxWorks
ff90: 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  ..**.** Semaphor
ffa0: 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  e locking is lik
ffb0: 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66  e dot-lock and f
ffc0: 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20  lock in that it 
ffd0: 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73  really only.** s
ffe0: 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56  upports EXCLUSIV
fff0: 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79  E locking.  Only
10000 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
10010 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72  s can read or wr
10020 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ite.** the datab
10030 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69  ase file at a ti
10040 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  me.  This reduce
10050 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63  s potential conc
10060 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20  urrency, but.** 
10070 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69  makes the lock i
10080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
10090 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69  ch easier..*/.#i
100a0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a  f OS_VXWORKS../*
100b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
100c0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
100d0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
100e0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
100f0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
10100 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
10110 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
10120 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
10130 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
10140 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
10150 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
10160 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
10170 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
10180 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
10190 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
101a0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
101b0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
101c0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
101d0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
101e0 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52  ic int semCheckR
101f0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
10200 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
10210 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
10220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10230 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
10240 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
10250 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10260 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
10270 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
10280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10290 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
102a0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
102b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
102c0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
102d0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
102e0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
102f0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
10300 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10310 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
10320 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
10330 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
10340 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
10350 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
10360 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
10370 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
10380 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
10390 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
103a0 6e 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  n->pSem;.    str
103b0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
103c0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
103d0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
103e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
103f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10400 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
10410 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
10420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10430 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10440 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10450 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
10460 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
10470 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10480 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
10490 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
104a0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
104b0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
104c0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
104d0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
104e0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
104f0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
10500 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
10510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10520 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
10530 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
10540 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
10550 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
10560 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
10570 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
10580 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
10590 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
105a0 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20  c, reserved);.. 
105b0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
105c0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
105d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
105e0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
105f0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
10600 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
10610 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
10620 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10630 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
10640 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
10650 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
10660 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
10670 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
10680 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
10690 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
106a0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
106b0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
106c0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
106d0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
106e0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
106f0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
10700 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
10710 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
10720 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
10730 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10740 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
10750 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
10760 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
10770 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
10780 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
10790 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
107a0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
107b0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
107c0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
107d0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
107e0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
107f0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
10800 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10810 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10820 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10830 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10840 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
10850 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10860 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10870 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
10880 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
10890 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
108a0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
108b0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
108c0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
108d0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
108e0 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
108f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
10900 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
10910 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
10920 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
10930 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
10940 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
10950 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
10960 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
10970 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
10980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10990 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
109a0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
109b0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
109c0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
109d0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
109e0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
109f0 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b  atic int semLock
10a00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10a10 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
10a20 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10a30 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10a40 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
10a50 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
10a60 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53  pFile->pOpen->pS
10a70 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
10a80 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
10a90 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
10aa0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
10ab0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
10ac0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
10ad0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
10ae0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
10af0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10b00 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  ktype > NO_LOCK)
10b10 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
10b20 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10b30 65 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e;.    rc = SQLI
10b40 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
10b50 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
10b60 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
10b70 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
10b80 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
10b90 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
10ba0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
10bb0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
10bc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10bd0 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
10be0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
10bf0 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
10c00 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
10c10 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
10c20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10c30 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20 73 65  = locktype;.. se
10c40 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
10c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10c60 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
10c70 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
10c80 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
10c90 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
10ca0 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
10cb0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10cc0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10cd0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10ce0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10cf0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10d00 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10d10 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10d20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10d30 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10d40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10d50 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10d60 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71  int semUnlock(sq
10d70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10d80 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
10d90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10da0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10db0 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
10dc0 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
10dd0 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
10de0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
10df0 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
10e00 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
10e10 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10e20 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
10e30 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20  h, locktype,..  
10e40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10e50 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61  , getpid());.  a
10e60 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
10e70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10e80 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
10e90 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
10ea0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
10eb0 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
10ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ed0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10ee0 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
10ef0 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
10f00 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
10f10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
10f20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
10f30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
10f40 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10f50 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
10f80 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
10f90 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
10fa0 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
10fb0 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
10fc0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10fe0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10ff0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11000 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
11010 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
11020 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11030 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11040 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11050 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11060 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
11070 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
11080 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
11090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
110a0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
110b0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
110c0 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
110d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
110e0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
110f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11100 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11110 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
11120 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
11130 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11140 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
11150 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
11160 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
11170 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
11180 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
11190 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
111a0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
111b0 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
111c0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
111d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111e0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
111f0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
11200 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
11210 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
11220 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
11230 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
11250 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
11260 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
11270 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
11280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
112e0 2a 2a 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 0a 2a 2a 2a  ************.***
11330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11340 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
11350 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
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 0a 2a 2a 0a  ************.**.
11380 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
11390 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
113a0 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
113b0 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
113c0 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
113d0 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
113e0 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
113f0 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
11400 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
11410 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
11420 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
11430 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
11440 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
11450 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
11460 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
11470 44 41 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c  DARWIN__) && SQL
11480 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11490 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
114a0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
114b0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
114c0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
114d0 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
114e0 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
114f0 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
11500 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
11510 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
11520 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
11530 65 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ext {.  unsigned
11540 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
11550 64 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  dByte;.  const c
11560 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
11570 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
11580 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
11590 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
115a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
115b0 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
115c0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
115d0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
115e0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
115f0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
11600 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
11610 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
11620 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
11630 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
11640 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
11650 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
11660 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
11670 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
11680 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
11690 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
116a0 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
116b0 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
116c0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
116d0 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
116e0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
116f0 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
11700 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
11710 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
11740 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
11750 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
11760 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
11770 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
11780 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
11790 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
117a0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
117b0 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
117c0 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
117d0 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
117e0 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
117f0 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
11800 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
11810 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
11820 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
11830 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
11840 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
11850 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
11860 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
11870 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
11880 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11890 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
118a0 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
118b0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
118c0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
118d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
118e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
118f0 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
11900 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
11910 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
11920 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
11930 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
11940 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11950 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
11960 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11970 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
11980 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
11990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
119a0 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
119b0 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
119c0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
119d0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
119e0 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
119f0 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
11a00 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
11a10 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
11a20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
11a30 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
11a40 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
11a50 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
11a60 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
11a70 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
11a80 43 45 36 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE6("AFPSETLOCK 
11a90 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
11aa0 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
11ab0 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
11ac0 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
11ad0 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
11ae0 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
11af0 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
11b00 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b  offset, length);
11b10 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
11b20 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
11b30 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
11b40 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
11b50 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
11b60 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
11b70 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11b80 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50     OSTRACE4("AFP
11b90 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
11ba0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
11bb0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
11bc0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
11bd0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
11be0 72 6e 6f 29 29 3b 0a 23 69 66 64 65 66 20 53 51  rno));.#ifdef SQ
11bf0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
11c00 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
11c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11c20 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
11c30 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11c40 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11c50 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11c60 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
11c70 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
11c80 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
11c90 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
11ca0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11cb0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
11cc0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
11cd0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11ce0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
11cf0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11d00 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
11d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11d20 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
11d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11d40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
11d50 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
11d60 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
11d70 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
11d80 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
11d90 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
11da0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
11db0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
11dc0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
11dd0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
11de0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
11df0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
11e00 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
11e10 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
11e20 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
11e30 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
11e40 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
11e50 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11e60 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
11e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
11e80 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
11e90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11ea0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
11eb0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
11ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11ed0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
11ee0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ef0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11f00 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
11f10 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
11f20 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
11f30 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
11f40 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
11f50 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b  ile );.  afpLock
11f60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
11f70 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
11f80 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
11f90 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
11fa0 74 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  t;.  .  /* Check
11fb0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11fc0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11fd0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11fe0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
11ff0 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
12000 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12010 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12020 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12030 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12040 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
12050 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
12060 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
12070 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
12080 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
12090 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
120a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
120b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
120c0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
120d0 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
120e0 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
120f0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
12100 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
12110 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
12120 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
12130 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
12140 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
12150 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
12160 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
12170 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
12180 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
12190 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
121a0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
121b0 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
121c0 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
121d0 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
121e0 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
121f0 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
12200 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
12210 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12220 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
12230 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
12240 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 34   }.  .  OSTRACE4
12250 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
12260 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c  d %d %d\n", pFil
12270 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12280 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  ed);.  .  *pResO
12290 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
122a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
122b0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
122c0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
122d0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
122e0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
122f0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12300 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
12310 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
12320 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
12330 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
12340 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12350 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
12360 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
12370 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
12380 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
12390 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
123a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
123b0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
123c0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
123d0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
123e0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
123f0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
12400 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
12410 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
12420 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
12430 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
12440 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
12450 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
12460 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
12470 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
12480 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
12490 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
124a0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
124b0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
124c0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
124d0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
124e0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
124f0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
12500 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12510 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12520 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
12530 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12540 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
12550 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
12560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12570 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
12580 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
12590 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
125a0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
125b0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
125c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
125d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
125e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
125f0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
12600 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
12610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
12620 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12630 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12640 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
12650 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
12660 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
12670 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
12680 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
12690 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
126a0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43  .  OSTRACE5("LOC
126b0 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
126c0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  s pid=%d\n", pFi
126d0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
126e0 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
126f0 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65  ktype), locktype
12700 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
12710 74 79 70 65 29 2c 20 67 65 74 70 69 64 28 29 29  type), getpid())
12720 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
12730 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
12740 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
12750 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
12760 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
12770 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
12780 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
12790 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
127a0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
127b0 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
127c0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
127d0 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
127e0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
127f0 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
12800 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
12810 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E3("LOCK    %d %
12820 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
12830 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
12840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
12850 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
12860 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pe));.    return
12870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12880 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
12890 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
128a0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
128b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
128c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
128d0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
128e0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
128f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
12900 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
12910 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
12920 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
12930 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
12940 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
12950 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
12960 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
12970 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
12980 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
12990 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
129a0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
129b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
129c0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
129d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
129e0 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
129f0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
12a00 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
12a10 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
12a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12a30 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
12a40 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72  tex();.    retur
12a50 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  n rc;.  }.    . 
12a60 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
12a70 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
12a80 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
12a90 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
12aa0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
12ab0 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
12ac0 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
12ad0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
12ae0 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
12af0 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
12b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
12b10 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
12b20 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f  CK .      || (lo
12b30 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
12b40 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
12b50 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e  >locktype<PENDIN
12b60 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
12b70 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
12b80 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
12b90 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
12ba0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
12bb0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
12bc0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
12bd0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
12be0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
12bf0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
12c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
12c10 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
12c20 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
12c30 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
12c40 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
12c50 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
12c60 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
12c70 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
12c80 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
12c90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
12ca0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
12cb0 20 6c 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c   lk, lrc1, lrc2,
12cc0 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12cd0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
12ce0 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
12cf0 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
12d00 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
12d10 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
12d20 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
12d30 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
12d40 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
12d50 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
12d60 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 42  context->sharedB
12d70 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66  yte = (lk & 0x7f
12d80 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
12d90 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
12da0 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc1 = afpSetLock
12db0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
12dc0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
12dd0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
12de0 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64  +context->shared
12df0 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
12e00 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12e10 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
12e20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
12e30 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
12e40 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
12e50 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
12e60 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
12e70 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
12e80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12e90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12ea0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
12eb0 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12ec0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12ed0 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
12ee0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12ef0 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12f00 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12f10 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12f20 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12f30 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12f40 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
12f50 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
12f60 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12f70 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12f80 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
12f90 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
12fa0 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
12fb0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
12fc0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
12fd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
12fe0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
12ff0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
13000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
13010 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
13020 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
13030 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
13040 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
13050 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
13060 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
13070 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13080 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
13090 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
130a0 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
130b0 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
130c0 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63  t( 0!=pFile->loc
130d0 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20  ktype );.    if 
130e0 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53  (locktype >= RES
130f0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
13100 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20  ile->locktype < 
13110 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
13120 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
13130 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
13140 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
13150 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
13160 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13170 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
13180 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
13190 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
131a0 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79 70  ailed && locktyp
131b0 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  e == EXCLUSIVE_L
131c0 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
131d0 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
131e0 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
131f0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
13200 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
13210 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
13220 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
13230 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
13240 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
13250 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
13260 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
13270 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
13280 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
13290 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
132a0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
132b0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
132c0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
132d0 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
132e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
132f0 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ext->sharedByte,
13300 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
13310 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
13320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13330 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
13340 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
13350 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
13360 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
13370 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
13380 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13390 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
133a0 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
133d0 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
133e0 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
133f0 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65  (failed2 = afpSe
13400 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13410 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
13440 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73 68  ST + context->sh
13450 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
13460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
13470 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
13480 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
13490 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
134a0 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
134b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
134c0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
134d0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
134e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
134f0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
13500 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
13510 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
13520 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
13530 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
13540 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
13550 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
13560 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
13570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13580 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
13590 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
135a0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
135b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
135c0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
135d0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
135e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
135f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
13600 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
13610 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
13620 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
13630 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
13640 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
13650 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
13660 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
13670 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13680 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
13690 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
136a0 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
136b0 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
136c0 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
136d0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
136e0 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
136f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13700 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
13710 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
13720 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
13730 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
13740 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
13750 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13760 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13770 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13780 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13790 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
137a0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
137b0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
137c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
137d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
137e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
137f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
13800 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
13810 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13820 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
13830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13840 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13850 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13860 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
13870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
13880 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
13890 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
138a0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
138b0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
138c0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
138d0 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
138e0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
138f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
13900 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
13910 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
13920 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61   getpid());..  a
13930 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
13940 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
13950 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
13960 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
13970 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
13990 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
139a0 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
139b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
139c0 53 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  SUSE;.  }.  unix
139d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
139e0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
139f0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
13a00 29 7b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  ){.    .    if( 
13a10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
13a20 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13a40 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64  pSetLock(pCtx->d
13a50 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
13a60 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
13a70 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
13a80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13a90 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  E_OK && locktype
13aa0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
13ab0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
13ac0 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
13ad0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
13ae0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
13af0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
13b00 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
13b10 44 5f 46 49 52 53 54 2b 70 43 74 78 2d 3e 73 68  D_FIRST+pCtx->sh
13b20 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
13b30 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
13b40 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  k(pCtx->dbPath, 
13b50 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
13b60 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
13b70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13b80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13b90 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
13ba0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
13bb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
13bc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78   afpSetLock(pCtx
13bd0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13be0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
13bf0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
13c00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13c10 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  OK && pFile->loc
13c20 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
13c30 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13c40 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
13c50 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
13c60 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
13c70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
13c80 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
13c90 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
13ca0 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 74 68 65      /* clear the
13cb0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
13cc0 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f      int sharedLo
13cd0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
13ce0 46 49 52 53 54 2b 70 43 74 78 2d 3e 73 68 61 72  FIRST+pCtx->shar
13cf0 65 64 42 79 74 65 3b 0a 20 20 20 20 72 63 20 3d  edByte;.    rc =
13d00 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78   afpSetLock(pCtx
13d10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13d20 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
13d30 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69   1, 0);.  }..  i
13d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13d50 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
13d60 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
13d70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75 6e  .      struct un
13d80 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
13d90 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
13da0 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
13db0 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
13dc0 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
13dd0 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
13de0 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
13df0 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
13e00 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
13e10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
13e20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65   for(i=0; i<pOpe
13e30 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b  n->nPending; i++
13e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13e50 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
13e60 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e  [i] < 0 ) contin
13e70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
13e80 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61  ( close(pOpen->a
13e90 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a 20  Pending[i]) ){. 
13ea0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
13eb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
13ec0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
13ed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
13ee0 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
13ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f00 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
13f10 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a  ending[i] = -1;.
13f20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13f60 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d  ite3_free(pOpen-
13f70 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
13f80 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
13f90 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
13fa0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
13fb0 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
13fc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13fd0 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  }.  }.  unixLeav
13fe0 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
13ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
14000 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14010 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
14020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14030 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
14040 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
14050 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
14060 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
14070 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
14080 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
14090 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
140a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
140b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
140c0 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
140d0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
140e0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
140f0 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
14100 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69  le->pOpen && pFi
14110 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
14120 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
14130 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
14140 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
14150 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
14160 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
14170 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
14180 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
14190 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
141a0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
141b0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
141c0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
141d0 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
141e0 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
141f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
14200 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
14210 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
14220 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
14230 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a    */.      int *
14240 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75  aNew;.      stru
14250 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
14260 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
14270 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77  Open;.      aNew
14280 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
14290 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  oc(pOpen->aPendi
142a0 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
142b0 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
142c0 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nt) );.      if(
142d0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
142e0 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
142f0 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c  oc fails, just l
14300 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
14310 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20  criptor */.     
14320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14330 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
14340 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
14350 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
14360 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
14370 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
14380 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
14390 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ding++;.        
143a0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
143b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
143c0 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
143d0 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
143e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
143f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
14400 6e 74 65 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73  ntext);.    clos
14410 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
14420 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14430 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
14440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14450 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
14460 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26  d(__DARWIN__) &&
14470 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
14480 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
14490 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
144a0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
144b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
144c0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
144d0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
144e0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
144f0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
14500 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
14510 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
14520 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
14530 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
14540 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
14550 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
14560 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
14570 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
14580 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
145a0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
145b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14620 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14680 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
14690 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
146a0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
146d0 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
146e0 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
146f0 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
14700 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
14710 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
14720 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
14730 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
14740 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
14750 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
14760 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
14770 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
14780 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
14790 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
147a0 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
147b0 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
147c0 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
147d0 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
147e0 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
147f0 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
14800 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
14810 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
14820 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
14830 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
14840 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
14850 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
14860 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
14870 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
14880 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
14890 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
148a0 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
148b0 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
148c0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
148d0 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
148e0 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
148f0 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
14900 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
14910 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
14920 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
14930 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
14940 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
14950 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79  USE_PREAD.** any
14960 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
14970 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
14980 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
14990 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
149a0 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
149b0 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
149c0 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
149d0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
149e0 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
149f0 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
14a00 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
14a10 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
14a20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
14a30 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
14a40 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
14a50 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
14a60 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
14a70 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
14a80 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34    int got;.  i64
14a90 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49   newOffset;.  TI
14aa0 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
14ab0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
14ac0 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ).  got = pread(
14ad0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
14ae0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
14af0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
14b00 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
14b10 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
14b20 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  D64).  got = pre
14b30 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
14b40 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14b50 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14b60 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14b70 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
14b80 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
14b90 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
14ba0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
14bb0 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
14bc0 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
14bd0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
14be0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
14bf0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
14c00 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
14c10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
14c20 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
14c30 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
14c40 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
14c50 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
14c60 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
14c70 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
14c80 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
14c90 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
14ca0 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
14cb0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
14cc0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
14cd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
14ce0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52 45 41  .  OSTRACE5("REA
14cf0 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
14d00 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
14d10 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
14d20 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
14d30 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
14d40 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
14d50 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
14d60 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
14d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
14d80 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
14d90 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
14da0 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
14db0 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
14dc0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
14dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14de0 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
14df0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
14e00 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
14e10 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
14e20 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
14e30 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
14e40 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
14e50 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
14e60 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  d((unixFile*)id,
14e70 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
14e80 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
14e90 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
14ea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14eb0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
14ec0 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
14ed0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
14ee0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
14ef0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14f00 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
14f10 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
14f20 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
14f30 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
14f40 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
14f50 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
14f60 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
14f70 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
14f80 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
14f90 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
14fa0 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
14fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14fc0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
14fd0 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
14fe0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
14ff0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
15000 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
15010 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
15020 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
15030 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15040 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
15050 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
15060 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
15070 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
15080 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
15090 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
150a0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
150b0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
150c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
150d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
150e0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
150f0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
15100 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
15110 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
15120 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34    int got;.  i64
15130 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49   newOffset;.  TI
15140 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
15150 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
15160 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
15170 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15180 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69  t, offset);.#eli
15190 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
151a0 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
151b0 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
151c0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
151d0 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
151e0 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
151f0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
15200 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77  _SET);.  if( new
15210 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
15220 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
15230 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
15240 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
15250 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
15260 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
15270 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
15280 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15290 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
152a0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
152b0 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74    }.  got = writ
152c0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
152d0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
152e0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
152f0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
15300 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
15310 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15320 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35 28    }..  OSTRACE5(
15330 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
15340 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
15350 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
15360 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
15370 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  ED);.  return go
15380 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15390 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
153a0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
153b0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
153c0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
153d0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
153e0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
153f0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
15400 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
15410 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15420 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
15430 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
15440 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
15450 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15460 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
15470 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
15480 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
15490 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d  0 );.  while( am
154a0 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
154b0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e  seekAndWrite((un
154c0 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73  ixFile*)id, offs
154d0 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e  et, pBuf, amt))>
154e0 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
154f0 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65  wrote;.    offse
15500 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t += wrote;.    
15510 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
15520 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
15530 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
15540 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29  ror(( wrote=(-1)
15550 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69  , amt=1 ));.  Si
15560 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
15570 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61  ror(( wrote=0, a
15580 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61  mt=1 ));.  if( a
15590 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  mt>0 ){.    if( 
155a0 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  wrote<0 ){.     
155b0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
155c0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
155d0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
155e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
155f0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
15600 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15610 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15620 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
15630 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
15640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15650 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
15660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15670 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
15680 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
15690 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
156a0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
156b0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
156c0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
156d0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
156e0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
156f0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
15700 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
15710 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
15720 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
15730 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
15740 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
15750 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
15760 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61  *.** Use the fda
15770 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c  tasync() API onl
15780 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46 44  y if the HAVE_FD
15790 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  ATASYNC macro is
157a0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68   defined..** Oth
157b0 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e 63  erwise use fsync
157c0 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  () in its place.
157d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45  .*/.#ifndef HAVE
157e0 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66  _FDATASYNC.# def
157f0 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
15800 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
15810 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
15820 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
15830 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
15840 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
15850 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
15860 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
15870 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
15880 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
15890 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
158a0 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
158b0 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
158c0 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
158d0 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
158e0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
158f0 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
15900 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
15910 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
15920 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
15930 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
15940 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
15950 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
15960 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
15970 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
15980 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
15990 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
159a0 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
159b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
159c0 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
159d0 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
159e0 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
159f0 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
15a00 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
15a10 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
15a20 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
15a30 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
15a40 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
15a50 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
15a60 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
15a70 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
15a80 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
15a90 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
15aa0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
15ab0 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
15ac0 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
15ad0 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
15ae0 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
15af0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
15b00 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
15b10 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
15b20 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
15b30 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
15b40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
15b50 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
15b60 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
15b70 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
15b80 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
15b90 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
15ba0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
15bb0 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
15bc0 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
15bd0 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
15be0 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
15bf0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
15c00 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
15c10 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
15c20 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
15c30 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
15c40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
15c50 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
15c60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
15c70 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
15c80 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
15c90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15ca0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
15cb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15cc0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 23  TER(fullSync);.#
15cd0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
15ce0 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
15cf0 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
15d00 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
15d10 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
15d20 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
15d30 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
15d40 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
15d50 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
15d60 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
15d70 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
15d80 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
15d90 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15da0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
15db0 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
15dc0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
15dd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
15de0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
15df0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
15e00 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
15e10 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
15e20 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
15e30 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
15e40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
15e50 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
15e60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
15e70 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
15e80 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
15e90 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63  c ){.    rc = fc
15ea0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
15eb0 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
15ec0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
15ed0 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
15ee0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
15ef0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
15f00 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
15f10 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
15f20 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
15f30 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
15f40 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
15f50 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
15f60 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
15f70 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
15f80 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
15f90 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
15fa0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
15fb0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
15fc0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
15fd0 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
15fe0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
15ff0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
16000 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
16010 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
16020 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
16030 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
16040 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
16050 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
16060 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
16070 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
16080 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
16090 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
160a0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
160b0 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c  e .  if( dataOnl
160c0 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64  y ){.    rc = fd
160d0 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  atasync(fd);.   
160e0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
160f0 26 26 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  && rc==-1 && err
16100 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
16110 20 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28       rc = fsync(
16120 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  fd);.    }.  }el
16130 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79  se{.    rc = fsy
16140 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
16150 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
16160 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
16170 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
16180 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
16190 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
161a0 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
161b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
161c0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
161d0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
161e0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
161f0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
16200 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
16210 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
16220 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
16230 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
16240 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
16250 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
16260 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
16270 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
16280 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
16290 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
162a0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
162b0 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
162c0 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
162d0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
162e0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
162f0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
16300 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
16310 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
16320 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
16330 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
16340 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
16350 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
16360 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
16370 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
16380 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
16390 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
163a0 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
163b0 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
163c0 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
163d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
163e0 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
163f0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
16400 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
16410 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
16420 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
16430 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
16440 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
16450 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
16460 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
16470 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
16480 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
16490 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
164a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
164b0 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
164c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
164d0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
164e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
164f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16500 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
16510 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
16520 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
16530 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
16540 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
16550 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
16560 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
16570 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
16580 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16590 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
165a0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
165b0 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
165c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
165d0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
165e0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
165f0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
16600 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
16610 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
16620 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
16630 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
16640 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
16650 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
16660 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
16670 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
16680 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
16690 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
166a0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
166b0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
166c0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
166d0 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53  );.  OSTRACE2("S
166e0 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
166f0 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20  pFile->h);.  rc 
16700 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
16710 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
16720 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
16730 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16740 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
16750 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
16760 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
16770 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
16780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
16790 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
167a0 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
167b0 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  .    int err;.  
167c0 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53    OSTRACE4("DIRS
167d0 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66  YNC %-3d (have_f
167e0 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
167f0 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
16800 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20  le->dirfd,.     
16810 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
16820 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
16830 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c);.#ifndef SQLI
16840 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
16850 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  NC.    /* The di
16860 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
16870 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
16880 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a  f full_fsync is.
16890 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66      ** turned of
168a0 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65  f or unavailable
168b0 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79  .  If a full_fsy
168c0 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  nc occurred abov
168d0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  e,.    ** then t
168e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
168f0 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  c is superfluous
16900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16910 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e   (!HAVE_FULLFSYN
16920 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63  C || !isFullsync
16930 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28  ) && full_fsync(
16940 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30  pFile->dirfd,0,0
16950 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20  ) ){.       /*. 
16960 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65        ** We have
16970 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
16980 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73  le reports of fs
16990 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a  ync() returning.
169a0 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
169b0 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f   when applied to
169c0 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20   directories on 
169d0 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73  certain file sys
169e0 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20  tems..       ** 
169f0 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f  A failed directo
16a00 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61  ry sync is not a
16a10 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69   big deal.  So i
16a20 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a  t seems.       *
16a30 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f  * better to igno
16a40 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54  re the error.  T
16a50 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20  icket #1657.    
16a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20     */.       /* 
16a70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16a80 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20   = errno; */.   
16a90 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51      /* return SQ
16aa0 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20  LITE_IOERR; */. 
16ab0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16ac0 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
16ad0 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e  e->dirfd); /* On
16ae0 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20  ly need to sync 
16af0 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74  once, so close t
16b00 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72  he */.    if( er
16b10 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  r==0 ){         
16b20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72       /* director
16b30 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f  y when we are do
16b40 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c  ne */.      pFil
16b50 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
16b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16b80 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
16b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
16ba0 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
16bb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16bc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
16bd0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
16be0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
16bf0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
16c00 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
16c10 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
16c20 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
16c30 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16c40 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
16c50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
16c60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16c70 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72  _TRUNCATE );.  r
16c80 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
16c90 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
16ca0 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
16cb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
16cc0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
16cd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
16ce0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
16cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
16d00 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NCATE;.  }else{.
16d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d20 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
16d30 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
16d40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
16d50 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
16d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
16d70 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
16d80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
16d90 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
16da0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
16db0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
16dc0 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66  ( id );.  rc = f
16dd0 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
16de0 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
16df0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16e00 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
16e10 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28   rc!=0 ){.    ((
16e20 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
16e30 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
16e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16e50 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
16e60 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
16e70 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
16e80 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
16e90 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
16ea0 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f  base, the findLo
16eb0 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  ckInfo() procedu
16ec0 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
16ed0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
16ee0 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
16ef0 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
16f00 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
16f10 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
16f20 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
16f30 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
16f40 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
16f50 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
16f60 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
16f70 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
16f80 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
16f90 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
16fa0 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
16fb0 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
16fc0 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
16fd0 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
16fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ff0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
17000 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
17010 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
17020 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 2f 2a  d(__DARWIN__)./*
17030 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
17040 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
17050 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
17060 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
17070 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
17080 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
17090 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
170a0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
170b0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
170c0 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
170d0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  endif.../*.** In
170e0 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
170f0 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
17100 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
17110 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17120 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
17130 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17140 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
17150 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
17160 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
17170 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
17180 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
17190 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
171a0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
171b0 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
171c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
171d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
171e0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
171f0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
17200 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a  rg = ((unixFile*
17210 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
17220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
17240 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
17250 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
17260 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  & defined(__DARW
17270 49 4e 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  IN__).    case S
17280 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
17290 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
172a0 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
172b0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
172c0 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
172d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
172e0 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
172f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17300 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17310 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
17320 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 2a 2f 0a 20  __DARWIN__) */. 
17330 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17340 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
17350 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
17360 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
17370 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
17380 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
17390 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
173a0 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
173b0 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
173c0 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
173d0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
173e0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
173f0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
17400 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
17410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
17420 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
17430 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
17440 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
17450 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
17460 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
17470 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
17480 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
17490 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
174a0 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
174b0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
174c0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
174d0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
174e0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
174f0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
17500 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
17510 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17520 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
17530 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
17540 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
17550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17560 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
17570 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
17580 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
17590 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75  s always 0 for u
175a0 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nix..*/.static i
175b0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
175c0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
175d0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
175e0 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
175f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
17600 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
17610 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
17620 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
17630 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
17640 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
17650 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
17660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
17670 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
17680 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
17690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
176b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176f0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
17700 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
17710 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  s definitions of
17720 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
17730 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74  ods objects that
17740 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61  .** implement va
17750 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69  rious file locki
17760 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
17770 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  It also contains
17780 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
17790 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  of "finder" func
177a0 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72  tions.  A finder
177b0 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65  -function is use
177c0 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
177d0 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73  appropriate.** s
177e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
177f0 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70  s object for a p
17800 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
17810 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41  se file.  The pA
17820 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20  ppData.** field 
17830 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  of the sqlite3_v
17840 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61  fs VFS objects a
17850 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
17860 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  o be pointers to
17870 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
17880 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
17890 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a  for that VFS..**
178a0 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20  .** Most finder 
178b0 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
178c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
178d0 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
178e0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
178f0 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e  ct.  The only in
17900 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72  teresting finder
17910 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74  -function is aut
17920 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77  olockIoFinder, w
17930 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74  hich.** looks at
17940 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
17950 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74  type and tries t
17960 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74  o guess the best
17970 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61   locking.** stra
17980 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a  tegy from that..
17990 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72  **.** For finder
179a0 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20  -funtion F, two 
179b0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
179c0 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
179d0 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
179e0 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
179f0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
17a00 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
17a10 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
17a20 68 69 73 20 66 75 6e 63 74 69 6f 20 6e 61 6d 65  his functio name
17a30 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
17a40 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
17a50 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
17a60 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
17a70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
17a80 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
17a90 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
17aa0 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
17ab0 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
17ac0 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
17ad0 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
17ae0 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
17af0 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
17b00 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
17b10 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
17b20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
17b30 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
17b40 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
17b50 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
17b60 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
17b70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
17b80 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
17b90 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
17ba0 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
17bb0 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
17bc0 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
17bd0 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
17be0 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
17bf0 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
17c00 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
17c10 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
17c20 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
17c30 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
17c40 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
17c50 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
17c60 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
17c70 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
17c80 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
17c90 48 4f 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  HOD, CLOSE, LOCK
17ca0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b  , UNLOCK, CKLOCK
17cb0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
17cc0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
17cd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
17ce0 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17d10 0a 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  .   1,          
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
17d60 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d80 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
17db0 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17dd0 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
17e00 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
17e50 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
17e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
17e70 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
17ea0 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
17ec0 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
17ef0 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
17f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
17f10 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
17f40 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
17f50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
17f60 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
17f90 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
17fa0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
17fb0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
17fe0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
17ff0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
18000 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
18030 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
18040 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
18050 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
18080 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
18090 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
180a0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
180d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
180e0 73 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s   /* xDeviceCa
180f0 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
18170 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
18180 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
18190 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
181a0 69 6e 74 20 68 29 7b 20 20 20 20 20 20 20 20 20  int h){         
181b0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
181c0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
181d0 50 41 52 41 4d 45 54 45 52 28 68 29 3b 20 20 20  PARAMETER(h);   
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18200 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
18210 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
18250 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
182a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
182b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
182c0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
182d0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
182e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
182f0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
18300 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
18310 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
18320 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
18330 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
18340 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
18350 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
18360 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
18370 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
18380 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
18390 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
183a0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
183b0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
183c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
183d0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
183e0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
183f0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
18400 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
18410 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
18420 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69  ct name */.  uni
18430 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
18440 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
18450 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
18460 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
18470 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
18480 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
18490 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
184a0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
184b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
184c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
184d0 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
184e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
184f0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
18500 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
18510 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
18520 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
18530 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
18540 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
18550 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
18560 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
18570 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ect name */.  no
18580 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
18590 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
185a0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
185b0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
185c0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
185d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
185e0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
185f0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
18600 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
18610 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
18620 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
18630 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
18640 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
18650 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
18660 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
18670 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
18680 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
18690 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
186a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
186b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
186c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ject name */.  d
186d0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
186e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
186f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
18700 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
18710 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
18720 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
18730 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
18740 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
18750 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
18760 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
18770 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
18780 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
18790 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
187a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
187b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
187c0 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
187d0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
187e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
187f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
18800 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
18810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
18820 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
18830 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
18840 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
18850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
18860 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
18870 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
18880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
18890 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
188a0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
188b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
188c0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
188d0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
188e0 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
188f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
18900 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
18910 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
18920 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
18930 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
18940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18950 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
18960 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
18970 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
18980 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
18990 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
189a0 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  ame */.  semClos
189b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
189c0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
189d0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
189e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
189f0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
18a00 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
18a10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
18a20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
18a30 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
18a40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
18a50 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
18a60 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
18a70 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
18a80 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
18a90 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  N__) && SQLITE_E
18aa0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18ab0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
18ac0 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
18ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18ae0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
18af0 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
18b00 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
18b10 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
18b20 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
18b30 61 6d 65 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  ame */.  afpClos
18b40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18b50 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
18b60 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
18b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b80 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
18b90 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
18ba0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
18bb0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
18bc0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
18bd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
18be0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
18bf0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
18c00 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
18c10 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
18c20 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
18c30 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
18c40 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
18c50 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
18c60 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
18c70 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
18c80 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
18c90 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
18ca0 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
18cb0 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
18cc0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
18cd0 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
18ce0 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
18cf0 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
18d00 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
18d10 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
18d20 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
18d30 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
18d40 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
18d50 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
18d60 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
18d70 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
18d80 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
18d90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
18da0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
18db0 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
18dc0 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
18dd0 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
18de0 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
18df0 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
18e00 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26  d(__DARWIN__) &&
18e10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18e20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
18e30 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
18e40 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
18e50 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
18e60 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
18e70 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
18e80 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
18e90 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18ea0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
18eb0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
18ec0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
18ed0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
18ee0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
18ef0 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
18f00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
18f10 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
18f20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
18f30 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
18f40 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
18f50 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
18f60 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
18f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18f80 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
18f90 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
18fc0 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
18fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
18fe0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
18ff0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
19000 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
19010 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
19020 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
19030 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  ).#endif...#if d
19040 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
19050 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19060 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19070 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
19080 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
19090 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
190a0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
190b0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
190c0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
190d0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
190e0 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
190f0 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
19100 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
19110 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
19120 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
19130 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
19140 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
19150 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
19160 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
19170 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
19180 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
19190 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
191a0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
191b0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
191c0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
191d0 20 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20   fd             
191e0 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
191f0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
19200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19210 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
19220 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
19230 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
19240 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
19250 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
19260 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
19270 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
19280 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
19290 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
192a0 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
192b0 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
192c0 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
192d0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
192e0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
192f0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
19300 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
19310 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
19320 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
19330 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23  fpIoMethods },.#
19340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19350 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f  BLE_AFP_LOCKING_
19360 53 4d 42 0a 20 20 20 20 7b 20 22 73 6d 62 66 73  SMB.    { "smbfs
19370 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
19380 73 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b  s },.#else.    {
19390 20 22 73 6d 62 66 73 22 2c 20 20 26 66 6c 6f 63   "smbfs",  &floc
193a0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65  kIoMethods },.#e
193b0 6e 64 69 66 0a 20 20 20 20 7b 20 22 77 65 62 64  ndif.    { "webd
193c0 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
193d0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
193e0 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
193f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
19400 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
19410 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
19420 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
19430 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
19440 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
19450 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
19460 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
19470 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
19480 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
19490 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
194a0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
194b0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
194c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
194d0 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
194e0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
194f0 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
19500 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
19510 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
19520 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
19530 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
19540 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
19550 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
19560 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
19570 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
19580 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
19590 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
195a0 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
195b0 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
195c0 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
195d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
195e0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
195f0 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
19600 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
19610 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
19620 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
19630 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
19640 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
19650 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
19660 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
19670 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
19680 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
19690 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
196a0 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
196b0 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
196c0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
196d0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
196e0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
196f0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
19700 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 66 64 2c  .  if( fcntl(fd,
19710 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
19720 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
19730 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
19740 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
19750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f  {.    return &do
19760 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  tlockIoMethods;.
19770 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
19780 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
19790 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 61  thods *(*const a
197a0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
197b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
197c0 29 0a 20 20 20 20 20 20 20 20 3d 20 61 75 74 6f  ).        = auto
197d0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
197e0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
197f0 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29  ined(__DARWIN__)
19800 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
19810 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
19820 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
19830 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
19840 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f   pointer to a IO
19850 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
19860 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
19870 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
19880 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
19890 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
198a0 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
198b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
198c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
19900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
19920 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
19950 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
19960 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
19970 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
19980 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
19990 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
199a0 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
199b0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
199c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75  ontents of the u
199d0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
199e0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
199f0 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pId..*/.static i
19a00 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
19a10 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
19a20 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
19a30 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
19a40 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
19a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19a60 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
19a70 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
19a80 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
19a90 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20  */.  int dirfd, 
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ab0 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
19ac0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
19ad0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
19ae0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
19af0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
19b00 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
19b10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
19b20 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
19b30 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
19b40 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
19b50 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20    int noLock,   
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
19b70 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75  t locking if tru
19b80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c  e */.  int isDel
19b90 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ete            /
19ba0 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
19bb0 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  e if true */.){.
19bc0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
19bd0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63  io_methods *pLoc
19be0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
19bf0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
19c00 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
19c10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19c20 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
19c30 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c  pNew->pLock==NUL
19c40 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  L );.  assert( p
19c50 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c  New->pOpen==NULL
19c60 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65   );..  /* Parame
19c70 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20  ter isDelete is 
19c80 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77  only used on vxw
19c90 6f 72 6b 73 2e 0a 20 20 2a 2a 20 45 78 70 72 65  orks..  ** Expre
19ca0 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
19cb0 6c 79 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ly here to preve
19cc0 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
19cd0 69 6e 67 73 0a 20 20 2a 2a 20 61 62 6f 75 74 20  ings.  ** about 
19ce0 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
19cf0 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  s..  */.#if !OS_
19d00 56 58 57 4f 52 4b 53 0a 20 20 55 4e 55 53 45 44  VXWORKS.  UNUSED
19d10 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c  _PARAMETER(isDel
19d20 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ete);.#endif..  
19d30 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20  OSTRACE3("OPEN  
19d40 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
19d50 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20   zFilename);    
19d60 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
19d70 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
19d80 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52  dirfd;.  SET_THR
19d90 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 23 69  EADID(pNew);..#i
19da0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
19db0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
19dc0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
19dd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
19de0 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
19df0 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20     noLock = 1;. 
19e00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19e10 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
19e20 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ..  if( noLock )
19e30 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
19e40 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
19e50 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
19e60 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
19e70 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
19e80 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
19e90 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
19ea0 20 68 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f   h);.#if SQLITE_
19eb0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19ec0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
19ed0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
19ee0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
19ef0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
19f00 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
19f10 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
19f20 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
19f30 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
19f40 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
19f50 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
19f60 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
19f70 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
19f80 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
19f90 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
19fa0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
19fb0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
19fc0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
19fd0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
19fe0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
19ff0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1a000 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
1a010 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
1a020 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
1a030 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63  New, &pNew->pLoc
1a040 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  k, &pNew->pOpen)
1a050 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
1a060 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
1a070 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a080 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1a090 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
1a0a0 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
1a0b0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1a0c0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
1a0d0 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
1a0e0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1a0f0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1a100 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1a110 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1a120 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1a130 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
1a140 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1a150 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
1a160 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1a170 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
1a180 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1a190 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
1a1a0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
1a1b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a1c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1a1d0 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
1a1e0 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
1a1f0 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
1a200 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
1a210 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
1a220 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
1a230 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
1a240 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
1a250 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
1a260 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
1a270 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
1a280 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
1a290 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
1a2a0 65 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  e;.      srandom
1a2b0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
1a2c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1a2d0 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f       rc = findLo
1a2e0 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 4e 55 4c  ckInfo(pNew, NUL
1a2f0 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  L, &pNew->pOpen)
1a300 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  ;.      unixLeav
1a310 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
1a320 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
1a330 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
1a340 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1a350 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
1a360 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
1a370 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
1a380 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
1a390 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
1a3a0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
1a3b0 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
1a3c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
1a3d0 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
1a3e0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
1a3f0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
1a400 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
1a410 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
1a420 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
1a430 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
1a440 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1a450 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
1a460 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
1a470 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1a4a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1a4b0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
1a4c0 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
1a4d0 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
1a4e0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
1a4f0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
1a500 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
1a510 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
1a520 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
1a530 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1a540 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
1a550 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
1a560 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
1a570 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
1a580 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
1a590 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
1a5a0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
1a5b0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
1a5c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
1a5d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a5e0 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1a5f0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1a600 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1a610 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28  Open);.    if( (
1a620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1a630 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e  & (pNew->pOpen->
1a640 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
1a650 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
1a660 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f 70 65  ame = pNew->pOpe
1a670 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  n->aSemName;.   
1a680 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1a690 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a6a0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1a6b0 53 65 6d 4e 61 6d 65 2c 20 22 25 73 2e 73 65 6d  SemName, "%s.sem
1a6c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a6d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1a6e0 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
1a6f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
1a700 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=0; zSemName[n
1a710 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
1a720 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
1a730 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
1a740 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
1a750 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53   pNew->pOpen->pS
1a760 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
1a770 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
1a780 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
1a790 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e   if( pNew->pOpen
1a7a0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
1a7b0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
1a7c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a7d0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
1a7e0 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65  >pOpen->aSemName
1a7f0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
1a800 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
1a810 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a820 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
1a830 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
1a840 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
1a850 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
1a860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
1a870 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
1a880 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
1a890 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
1a8a0 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
1a8b0 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
1a8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a8d0 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  ){.    if( dirfd
1a8e0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
1a8f0 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c 65  d); /* silent le
1a900 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
1a910 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
1a920 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
1a930 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1a940 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
1a950 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
1a960 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
1a970 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a980 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1a990 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a9a0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1a9b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
1a9c0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
1a9d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
1a9e0 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
1a9f0 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
1aa00 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
1aa10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1aa20 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1aa30 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
1aa40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1aa50 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
1aa60 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
1aa70 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
1aa80 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
1aa90 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
1aaa0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1aab0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1aac0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1aad0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1aae0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1aaf0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1ab00 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1ab10 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1ab20 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1ab30 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1ab40 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1ab50 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1ab60 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1ab70 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1ab80 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1ab90 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1aba0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1abb0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1abc0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1abd0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1abe0 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61   ii>=0 && zDirna
1abf0 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1ac00 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1ac10 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1ac20 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1ac30 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
1ac40 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1ac50 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1ac60 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
1ac70 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
1ac80 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
1ac90 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
1aca0 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
1acb0 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
1acc0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  f.      OSTRACE3
1acd0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1ace0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1acf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1ad00 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1ad10 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1ad20 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e  TE_OK:SQLITE_CAN
1ad30 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TOPEN);.}../*.**
1ad40 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
1ad50 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
1ad60 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
1ad70 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
1ad80 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1ad90 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
1ada0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
1adb0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
1adc0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
1add0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
1adf0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1ae00 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1ae10 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1ae20 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
1ae30 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
1ae40 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
1ae50 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
1ae60 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
1ae70 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73     ".",.  };.  s
1ae80 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1ae90 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
1aea0 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
1aeb0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
1aec0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
1aed0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
1aee0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
1aef0 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
1af00 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
1af10 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1af20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af30 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
1af40 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
1af50 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
1af60 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
1af70 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
1af80 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
1af90 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
1afa0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1afb0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1afc0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1afd0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
1afe0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
1aff0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1b000 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
1b010 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
1b020 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1b030 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c  tory;.  if (NULL
1b040 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b   == azDirs[1]) {
1b050 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d  .    azDirs[1] =
1b060 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
1b070 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28  );.  }.  .  for(
1b080 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
1b090 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
1b0a0 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
1b0b0 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d     if( azDirs[i]
1b0c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1b0d0 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44      if( stat(azD
1b0e0 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20  irs[i], &buf) ) 
1b0f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1b100 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
1b110 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
1b120 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ue;.    if( acce
1b130 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37  ss(azDirs[i], 07
1b140 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1b150 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
1b160 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  i];.    break;. 
1b170 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
1b180 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
1b190 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
1b1a0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
1b1b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
1b1c0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
1b1d0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
1b1e0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
1b1f0 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
1b200 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
1b210 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1b220 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
1b230 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
1b240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b250 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1b260 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
1b270 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
1b280 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
1b290 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1b2a0 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
1b2b0 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
1b2c0 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
1b2d0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
1b2e0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
1b2f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
1b300 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1b310 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
1b320 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
1b330 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
1b340 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
1b350 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
1b360 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
1b370 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
1b380 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
1b390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b3a0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1b3b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1b3c0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1b3d0 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 2f 2a 0a  (__DARWIN__)./*.
1b3e0 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
1b3f0 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
1b400 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
1b410 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
1b420 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
1b430 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
1b440 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
1b450 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
1b460 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
1b470 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
1b480 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
1b490 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1b4a0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
1b4b0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
1b4c0 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
1b4d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
1b4e0 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
1b4f0 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
1b500 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
1b510 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
1b520 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
1b530 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
1b540 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
1b550 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
1b560 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
1b570 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
1b580 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
1b590 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
1b5a0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
1b5b0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
1b5c0 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
1b5d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1b5e0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
1b5f0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
1b600 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
1b610 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
1b620 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
1b630 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
1b640 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
1b650 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
1b660 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
1b670 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
1b680 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
1b690 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
1b6a0 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
1b6b0 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
1b6c0 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
1b6d0 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
1b6e0 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
1b6f0 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
1b700 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
1b710 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
1b720 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
1b730 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
1b740 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
1b750 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
1b760 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
1b770 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
1b780 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
1b790 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
1b7a0 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
1b7b0 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
1b7c0 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
1b7d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b7e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1b7f0 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
1b800 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
1b810 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
1b820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1b830 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
1b840 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
1b850 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1b860 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1b870 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
1b880 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1b890 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
1b8a0 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
1b8b0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
1b8d0 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
1b8e0 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
1b8f0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
1b900 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1b910 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
1b920 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
1b930 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
1b940 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20 20 20   int fd = 0;    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1b970 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
1b980 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64  pen() */.  int d
1b990 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  irfd = -1;      
1b9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
1b9b0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1b9c0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
1b9d0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
1b9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1b9f0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
1ba00 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
1ba10 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
1ba20 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
1ba30 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
1ba40 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
1ba50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1ba60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1ba70 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
1ba80 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
1ba90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1baa0 3b 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  ;..  int isExclu
1bab0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
1bac0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1bad0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
1bae0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
1baf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1bb00 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1bb10 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
1bb20 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1bb30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1bb40 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
1bb50 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
1bb60 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1bb70 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
1bb80 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
1bb90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1bba0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
1bbb0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
1bbc0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
1bbd0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
1bbe0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1bbf0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
1bc00 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1bc10 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
1bc20 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
1bc30 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
1bc40 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
1bc50 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
1bc60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
1bc70 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
1bc80 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
1bc90 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
1bca0 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
1bcb0 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
1bcc0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1bcd0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1bce0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
1bcf0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1bd00 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
1bd10 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
1bd20 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
1bd30 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
1bd40 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
1bd50 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
1bd60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
1bd70 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
1bd80 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1bd90 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
1bda0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
1bdb0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1bdc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1bdd0 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
1bde0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
1bdf0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
1be00 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
1be10 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
1be20 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
1be30 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
1be40 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
1be50 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
1be60 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
1be70 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
1be80 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
1be90 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
1bea0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
1beb0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
1bec0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
1bed0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
1bee0 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
1bef0 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
1bf00 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
1bf10 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
1bf20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
1bf30 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
1bf40 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
1bf50 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
1bf60 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
1bf70 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
1bf80 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
1bf90 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
1bfa0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
1bfb0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
1bfc0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
1bfd0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
1bfe0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
1bff0 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
1c000 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  , and master jou
1c010 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61  rnal are never a
1c020 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
1c030 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20  * deleted.  */. 
1c040 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
1c050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1c060 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  _DB || !isDelete
1c070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
1c080 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1c090 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
1c0a0 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20   !isDelete );.  
1c0b0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
1c0c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1c0d0 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73  R_JOURNAL || !is
1c0e0 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
1c0f0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1c100 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
1c110 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
1c120 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
1c130 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
1c140 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1c150 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
1c160 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1c170 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
1c180 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1c190 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c1a0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
1c1b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1c1c0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
1c1d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1c1e0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1c1f0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
1c200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1c210 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
1c220 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1c230 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1c240 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65  NT_DB.  );..  me
1c250 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
1c260 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
1c270 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  ;..  if( !zName 
1c280 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
1c290 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1c2a0 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
1c2b0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
1c2c0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
1c2d0 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
1c2e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c2f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c300 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c310 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
1c320 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  e;.  }..  if( is
1c330 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
1c340 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
1c350 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
1c360 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
1c370 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
1c380 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
1c390 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
1c3a0 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
1c3b0 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
1c3c0 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
1c3d0 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
1c3e0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
1c3f0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
1c400 29 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28  );..  fd = open(
1c410 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
1c420 2c 20 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a  , isDelete?0600:
1c430 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1c440 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
1c450 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50  ;.  OSTRACE4("OP
1c460 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
1c470 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
1c480 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
1c490 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
1c4a0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
1c4b0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
1c4c0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
1c4d0 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
1c4e0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
1c4f0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
1c500 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
1c510 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  */.    flags &= 
1c520 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
1c530 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1c540 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
1c550 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
1c560 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
1c570 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f      return unixO
1c580 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c  pen(pVfs, zPath,
1c590 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70   pFile, flags, p
1c5a0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
1c5b0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
1c5c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c5d0 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69  ANTOPEN;.  }.  i
1c5e0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
1c5f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c600 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
1c610 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e  .#else.    unlin
1c620 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
1c630 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1c640 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c650 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
1c660 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
1c670 6c 65 29 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  le)->openFlags =
1c680 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
1c690 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 75  #endif.  if( pOu
1c6a0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
1c6b0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
1c6c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1c6d0 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73  fd!=0);.  if( is
1c6e0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
1c6f0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
1c700 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
1c710 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1c720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c730 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
1c740 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
1c750 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
1c760 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
1c770 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1c790 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1c7a0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
1c7b0 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  D, fcntl(fd, F_G
1c7c0 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
1c7d0 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
1c7e0 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
1c7f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1c800 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49  IN_DB;..#if SQLI
1c810 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
1c820 4c 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50  LOCKING.  if( zP
1c830 61 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f  ath!=NULL && !no
1c840 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  Lock ){.    char
1c850 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
1c860 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
1c870 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
1c880 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
1c890 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
1c8a0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
1c8b0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
1c8c0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
1c8d0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 0a 20 20  s use proxy, .  
1c8e0 20 20 2a 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76    ** 0 means nev
1c8f0 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
1c900 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
1c910 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
1c920 20 66 69 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20   files only.    
1c930 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
1c940 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
1c950 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
1c960 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
1c970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c980 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
1c990 73 49 6e 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66  sInfo;..      if
1c9a0 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
1c9b0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
1c9c0 7b 0a 09 09 09 09 28 28 75 6e 69 78 46 69 6c 65  {.....((unixFile
1c9d0 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
1c9e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c9f0 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
1ca00 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
1ca10 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
1ca20 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
1ca30 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
1ca40 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
1ca50 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
1ca60 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
1ca70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ca80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1ca90 45 53 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ESS;.      }.   
1caa0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
1cab0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
1cac0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
1cad0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
1cae0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
1caf0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
1cb00 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
1cb10 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
1cb20 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
1cb30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1cb40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb50 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
1cb60 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
1cb70 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
1cb80 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
1cb90 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1cba0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1cbb0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
1cbc0 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  rn fillInUnixFil
1cbd0 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
1cbe0 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
1cbf0 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74   noLock, isDelet
1cc00 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  e);.}../*.** Del
1cc10 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
1cc20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
1cc30 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
1cc40 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
1cc50 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1cc60 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
1cc70 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
1cc80 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
1cc90 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
1cca0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
1ccb0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
1ccc0 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
1ccd0 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
1cce0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1ccf0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
1cd00 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
1cd10 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
1cd20 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
1cd30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1cd40 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
1cd50 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
1cd60 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
1cd70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cd80 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
1cd90 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1cda0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
1cdb0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
1cdc0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
1cdd0 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
1cde0 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
1cdf0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
1ce00 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
1ce10 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
1ce20 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
1ce30 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
1ce40 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1ce50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
1ce60 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
1ce70 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
1ce80 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
1ce90 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
1cea0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
1ceb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cec0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
1ced0 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
1cee0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
1cef0 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
1cf00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1cf10 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
1cf20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cf30 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1cf40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
1cf50 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
1cf60 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
1cf70 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
1cf80 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
1cf90 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
1cfa0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
1cfb0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
1cfc0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
1cfd0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
1cfe0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
1cff0 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
1d000 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
1d010 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
1d020 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
1d030 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
1d040 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
1d050 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
1d060 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
1d070 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
1d080 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
1d090 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
1d0a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1d0b0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
1d0c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
1d0d0 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
1d0e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
1d0f0 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
1d100 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d110 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
1d120 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
1d130 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
1d140 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1d150 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
1d160 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
1d170 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
1d180 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
1d190 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
1d1a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
1d1b0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
1d1c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
1d1d0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
1d1e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1d1f0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
1d200 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1d210 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
1d220 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
1d230 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
1d240 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1d250 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
1d260 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
1d270 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d280 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1d290 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
1d2a0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
1d2b0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
1d2c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1d2d0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
1d2e0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
1d2f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
1d300 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
1d310 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
1d320 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
1d330 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
1d340 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
1d350 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
1d360 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
1d370 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1d380 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
1d390 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
1d3a0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
1d3b0 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
1d3c0 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
1d3d0 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
1d3e0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
1d3f0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
1d400 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
1d410 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
1d420 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1d430 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
1d440 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
1d450 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
1d460 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
1d470 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
1d480 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
1d490 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
1d4a0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
1d4b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1d4c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d4d0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
1d4e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1d4f0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
1d500 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
1d510 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1d520 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d540 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
1d550 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
1d560 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d580 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
1d590 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
1d5a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
1d5d0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
1d5e0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1d5f0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1d600 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1d610 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1d620 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1d630 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1d640 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1d650 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1d660 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1d670 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
1d680 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
1d690 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
1d6a0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
1d6b0 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
1d6c0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
1d6d0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
1d6e0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1d6f0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1d700 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
1d710 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
1d720 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
1d730 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
1d740 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1d750 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
1d760 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
1d770 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
1d780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1d790 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
1d7a0 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
1d7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d7c0 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
1d7d0 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
1d7e0 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
1d7f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d800 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
1d810 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
1d820 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
1d830 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1d840 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
1d850 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
1d860 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
1d870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d880 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
1d890 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1d8a0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
1d8b0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1d8c0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1d8d0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1d8e0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1d8f0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1d900 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1d910 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1d920 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
1d930 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
1d940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
1d950 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
1d960 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
1d970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1d980 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
1d990 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1d9a0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
1d9b0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
1d9c0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
1d9d0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
1d9e0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
1d9f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
1da00 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
1da10 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
1da20 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
1da30 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
1da40 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
1da50 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
1da60 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
1da70 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
1da80 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
1da90 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
1daa0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
1dab0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
1dac0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
1dad0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1dae0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
1daf0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
1db00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
1db10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1db20 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
1db30 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
1db40 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1db50 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72  zBufOut){.  char
1db60 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
1db70 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1db80 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
1db90 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
1dba0 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
1dbb0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
1dbc0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1dbd0 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
1dbe0 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
1dbf0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1dc00 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
1dc10 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
1dc20 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
1dc30 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
1dc40 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
1dc50 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
1dc60 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
1dc70 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
1dc80 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
1dc90 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
1dca0 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
1dcb0 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1dcc0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
1dcd0 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
1dce0 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
1dcf0 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
1dd00 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
1dd10 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
1dd20 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
1dd30 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
1dd40 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
1dd50 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
1dd60 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
1dd70 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
1dd80 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
1dd90 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
1dda0 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
1ddb0 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
1ddc0 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
1ddd0 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
1dde0 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
1ddf0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
1de00 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
1de10 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
1de20 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
1de30 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
1de40 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
1de50 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
1de60 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
1de70 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
1de80 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
1de90 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
1dea0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
1deb0 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
1dec0 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
1ded0 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
1dee0 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
1def0 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
1df00 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
1df10 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
1df20 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
1df30 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
1df40 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
1df50 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
1df60 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
1df70 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
1df80 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
1df90 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
1dfa0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
1dfb0 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
1dfc0 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
1dfd0 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
1dfe0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1dff0 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
1e000 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
1e010 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
1e020 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
1e030 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
1e040 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
1e050 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
1e060 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
1e070 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
1e080 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1e090 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
1e0a0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
1e0b0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
1e0c0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1e0d0 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
1e0e0 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
1e0f0 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
1e100 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
1e110 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
1e120 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
1e130 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
1e140 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
1e150 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
1e160 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
1e170 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
1e180 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
1e190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1e1a0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
1e1b0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
1e1c0 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
1e1d0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
1e1e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1e1f0 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
1e200 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
1e210 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
1e220 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
1e230 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
1e240 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
1e250 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
1e260 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
1e270 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
1e280 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
1e290 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
1e2a0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
1e2b0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
1e2c0 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
1e2d0 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
1e2e0 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
1e2f0 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
1e300 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
1e310 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
1e320 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
1e330 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
1e340 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
1e350 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
1e360 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
1e370 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
1e380 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
1e390 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
1e3a0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
1e3b0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
1e3c0 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
1e3d0 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
1e3e0 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
1e3f0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
1e400 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
1e410 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
1e420 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
1e430 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
1e440 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
1e450 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
1e460 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
1e470 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
1e480 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
1e490 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
1e4a0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
1e4b0 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
1e4c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e4d0 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
1e4e0 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
1e4f0 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
1e500 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
1e510 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
1e520 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
1e530 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
1e540 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
1e550 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
1e560 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
1e570 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
1e580 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
1e590 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
1e5a0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
1e5b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1e5c0 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
1e5d0 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
1e5e0 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
1e5f0 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
1e600 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
1e610 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  e{.      nBuf = 
1e620 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
1e630 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
1e640 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
1e650 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1e660 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
1e670 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1e680 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1e690 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1e6a0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
1e6b0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1e6c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
1e6d0 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
1e6e0 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
1e6f0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1e700 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1e710 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
1e720 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
1e730 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
1e740 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
1e750 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
1e760 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
1e770 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
1e780 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1e790 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
1e7a0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
1e7b0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
1e7c0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1e7d0 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
1e7e0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1e7f0 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
1e800 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
1e810 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1e820 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
1e830 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
1e840 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
1e850 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
1e860 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
1e870 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
1e880 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
1e890 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
1e8a0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
1e8b0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
1e8c0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
1e8d0 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
1e8e0 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
1e8f0 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  onds);.  return 
1e900 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
1e910 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
1e920 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
1e930 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
1e940 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
1e950 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ds);.  return se
1e960 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
1e970 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
1e980 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1e990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
1e9a0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1e9b0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
1e9c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
1e9d0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1e9e0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
1e9f0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
1ea00 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
1ea10 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
1ea20 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
1ea30 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
1ea40 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
1ea50 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1ea60 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1ea70 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1ea80 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
1ea90 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
1eaa0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
1eab0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1eac0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1ead0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1eae0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1eaf0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1eb00 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
1eb10 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1eb20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
1eb30 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
1eb40 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
1eb50 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1eb60 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1eb70 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1eb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1eb90 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
1eba0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1ebb0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
1ebc0 6f 77 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ow){.#if defined
1ebd0 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
1ebe0 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
1ebf0 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
1ec00 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
1ec10 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  87.5;.#elif OS_V
1ec20 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1ec30 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
1ec40 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
1ec50 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
1ec60 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  sNow);.  *prNow 
1ec70 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
1ec80 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
1ec90 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  0 + sNow.tv_nsec
1eca0 2f 38 36 34 30 30 30 30 30 30 30 30 30 30 30 2e  /86400000000000.
1ecb0 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
1ecc0 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
1ecd0 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
1ece0 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e  sNow, 0);.  *prN
1ecf0 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
1ed00 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
1ed10 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  00.0 + sNow.tv_u
1ed20 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e  sec/86400000000.
1ed30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
1ed40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1ed50 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
1ed60 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
1ed70 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33  *prNow = sqlite3
1ed80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36  _current_time/86
1ed90 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
1eda0 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  5;.  }.#endif.  
1edb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1edc0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1edd0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1ede0 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
1edf0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
1ee00 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
1ee10 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
1ee20 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
1ee30 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
1ee40 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
1ee50 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
1ee60 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
1ee70 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
1ee80 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
1ee90 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
1eea0 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
1eeb0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
1eec0 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
1eed0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
1eee0 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
1eef0 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
1ef00 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
1ef10 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1ef20 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
1ef30 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1ef40 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
1ef50 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
1ef60 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
1ef70 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1ef80 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
1ef90 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1efa0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
1efb0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
1efc0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1efd0 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
1efe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1eff0 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
1f000 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1f010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f020 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1f030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f070 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1f080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1f0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1f0e0 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
1f0f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1f100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f110 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ****.**.** Proxy
1f120 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75   locking is a "u
1f130 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
1f140 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73  od" in this sens
1f150 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a  e:  It uses the.
1f160 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
1f170 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f   methods on seco
1f180 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73  ndary lock files
1f190 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  .  Proxy locking
1f1a0 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61   is a.** meta-la
1f1b0 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20  yer over top of 
1f1c0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
1f1d0 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65  cking implemente
1f1e0 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a  d above.  For.**
1f1f0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
1f200 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
1f210 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72  implements of pr
1f220 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  oxy locking is d
1f230 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c  eferred.** until
1f240 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c   late in the fil
1f250 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61  e (here) after a
1f260 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ll of the other 
1f270 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65  I/O methods have
1f280 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64  .** been defined
1f290 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70   - so that the p
1f2a0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
1f2b0 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61   methods are ava
1f2c0 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72  ilable.** as ser
1f2d0 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69  vices to help wi
1f2e0 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  th the implement
1f2f0 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c  ation of proxy l
1f300 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a  ocking..**.****.
1f310 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f320 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  t locking scheme
1f330 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20  s in SQLite use 
1f340 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
1f350 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
1f360 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72  ase file to coor
1f370 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e  dinate safe, con
1f380 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62  current access b
1f390 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  y multiple reade
1f3a0 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72  rs.** and writer
1f3b0 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65  s [http://sqlite
1f3c0 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68  .org/lockingv3.h
1f3d0 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20  tml].  The five 
1f3e0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
1f3f0 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44  states (UNLOCKED
1f400 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45  , PENDING, SHARE
1f410 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43  D, RESERVED, EXC
1f420 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c  LUSIVE) are impl
1f430 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f  emented.** as PO
1f440 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65  SIX read & write
1f450 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65   locks over fixe
1f460 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f  d set of locatio
1f470 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a  ns (via fsctl),.
1f480 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d  ** on AFP and SM
1f490 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65  B only exclusive
1f4a0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
1f4b0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
1f4c0 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74  via fsctl.** wit
1f4d0 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  h _IOWR('z', 23,
1f4e0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
1f4f0 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61  eLockPB2) to tra
1f500 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74  ck the same 5 st
1f510 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75  ates..** To simu
1f520 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f  late a F_RDLCK o
1f530 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
1f540 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e  ge, on AFP a ran
1f550 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a  domly selected.*
1f560 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  * address in the
1f570 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
1f580 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41   taken for a SHA
1f590 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e  RED lock, the en
1f5a0 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72  tire.** shared r
1f5b0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
1f5c0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
1f5d0 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ock):.**.**     
1f5e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20   PENDING_BYTE   
1f5f0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09       0x40000000.
1f600 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45  .   ..**      RE
1f610 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
1f620 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
1f630 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
1f640 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
1f650 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
1f660 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
1f670 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
1f680 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
1f690 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
1f6a0 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
1f6b0 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
1f6c0 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
1f6d0 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
1f6e0 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
1f6f0 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
1f700 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
1f710 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
1f720 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
1f730 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
1f740 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
1f750 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
1f760 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
1f770 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
1f780 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
1f790 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
1f7a0 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
1f7b0 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
1f7c0 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
1f7d0 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
1f7e0 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
1f7f0 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
1f800 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
1f810 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
1f820 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
1f830 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
1f840 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
1f850 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
1f860 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
1f870 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
1f880 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
1f890 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
1f8a0 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
1f8b0 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
1f8c0 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
1f8d0 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
1f8e0 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
1f8f0 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
1f900 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
1f910 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
1f920 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
1f930 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
1f940 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
1f950 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
1f960 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
1f970 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
1f980 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
1f990 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
1f9a0 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
1f9b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f9c0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
1f9d0 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
1f9e0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
1f9f0 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
1fa00 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
1fa10 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
1fa20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
1fa30 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
1fa40 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1fa50 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
1fa60 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1fa70 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
1faa0 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
1fab0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1fac0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
1fad0 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
1fae0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
1faf0 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
1fb00 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
1fb10 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
1fb20 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
1fb30 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
1fb40 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
1fb50 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
1fb60 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
1fb70 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
1fb80 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
1fb90 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
1fba0 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
1fbb0 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
1fbc0 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
1fbd0 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
1fbe0 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
1fbf0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
1fc00 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
1fc10 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
1fc20 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
1fc30 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
1fc40 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
1fc50 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
1fc60 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
1fc70 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
1fc80 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
1fc90 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
1fca0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
1fcb0 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
1fcc0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1fcd0 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
1fce0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
1fcf0 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
1fd00 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
1fd10 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
1fd20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
1fd30 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
1fd40 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
1fd50 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
1fd60 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
1fd70 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
1fd80 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
1fd90 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
1fda0 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
1fdb0 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
1fdc0 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
1fdd0 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
1fde0 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
1fdf0 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
1fe00 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
1fe10 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
1fe20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
1fe30 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
1fe40 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
1fe50 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
1fe60 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
1fe70 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
1fe80 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
1fe90 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
1fea0 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
1feb0 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
1fec0 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
1fed0 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
1fee0 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
1fef0 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
1ff00 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
1ff10 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1ff20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
1ff30 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
1ff40 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
1ff50 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
1ff60 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
1ff70 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
1ff80 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
1ff90 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
1ffa0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
1ffb0 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
1ffc0 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
1ffd0 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
1ffe0 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
1fff0 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
20000 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
20010 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
20020 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
20030 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
20040 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
20050 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
20060 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
20070 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
20080 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
20090 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
200a0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
200b0 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
200c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
200d0 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
200e0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
200f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
20100 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
20110 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
20120 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
20130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
20140 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
20150 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
20160 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
20170 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
20180 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
20190 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
201a0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
201b0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
201c0 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
201d0 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
201e0 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
201f0 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
20200 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
20210 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
20220 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
20230 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
20240 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
20250 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
20260 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
20270 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
20280 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
20290 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
202a0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
202b0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
202c0 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
202d0 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
202e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
202f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
20300 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
20310 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
20320 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
20330 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
20340 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
20350 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20360 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
20370 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
20380 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
20390 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
203a0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
203b0 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
203c0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
203d0 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
203e0 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
203f0 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
20400 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
20410 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
20420 20 61 20 74 68 69 72 64 20 66 69 6c 65 20 2d 20   a third file - 
20430 74 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65  the host ID file
20440 20 2d 20 75 73 65 64 20 61 73 20 61 20 70 65 72   - used as a per
20450 73 69 73 74 65 6e 74 20 72 65 63 6f 72 64 0a 2a  sistent record.*
20460 2a 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 64  * of a unique id
20470 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65  entifier for the
20480 20 68 6f 73 74 2c 20 61 20 31 32 38 2d 62 79 74   host, a 128-byt
20490 65 20 75 6e 69 71 75 65 20 68 6f 73 74 20 69 64  e unique host id
204a0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20   file.** in the 
204b0 70 61 74 68 20 64 65 66 69 6e 65 64 20 62 79 20  path defined by 
204c0 74 68 65 20 48 4f 53 54 49 44 50 41 54 48 20 6d  the HOSTIDPATH m
204d0 61 63 72 6f 20 28 64 65 66 61 75 6c 74 20 76 61  acro (default va
204e0 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c 69 62 72 61  lue is.** /Libra
204f0 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61  ry/Caches/.com.a
20500 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68  pple.sqliteConch
20510 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a 2a 20 52  HostId)..**.** R
20520 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
20530 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
20540 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
20550 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
20560 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
20570 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
20580 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
20590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
205a0 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
205b0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
205c0 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
205d0 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
205e0 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
205f0 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
20600 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
20610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
20620 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
20630 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
20640 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
20650 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
20660 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
20670 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
20680 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
20690 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
206a0 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
206b0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
206c0 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
206d0 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
206e0 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
206f0 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
20700 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
20710 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
20720 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
20730 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
20740 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
20750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
20760 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
20770 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
20780 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
20790 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
207a0 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
207b0 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
207c0 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
207d0 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
207e0 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
207f0 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
20800 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
20810 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
20820 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
20830 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
20840 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
20850 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
20860 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
20870 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
20880 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
20890 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
208a0 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
208b0 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
208c0 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
208d0 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
208e0 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 48 4f  eation.**.**  HO
208f0 53 54 49 44 50 41 54 48 0a 2a 2a 0a 2a 2a 20 20  STIDPATH.**.**  
20900 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
20910 68 65 20 64 65 66 61 75 6c 74 20 68 6f 73 74 20  he default host 
20920 49 44 20 66 69 6c 65 20 70 61 74 68 20 6c 6f 63  ID file path loc
20930 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
20940 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
20950 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
20960 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
20970 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
20980 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
20990 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
209a0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
209b0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
209c0 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
209d0 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
209e0 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
209f0 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
20a00 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
20a10 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
20a20 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
20a30 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
20a40 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
20a50 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
20a60 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
20a70 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
20a80 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
20a90 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
20aa0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
20ab0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
20ac0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
20ad0 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
20ae0 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
20af0 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
20b00 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
20b10 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
20b20 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
20b30 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
20b40 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
20b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
20b60 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
20b70 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
20b80 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
20b90 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
20ba0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
20bb0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
20bc0 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
20bd0 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
20be0 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
20bf0 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
20c00 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
20c10 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
20c20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
20c30 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
20c40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
20c50 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
20c60 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
20c70 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
20c80 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20  ned(__DARWIN__) 
20c90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
20ca0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
20cb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
20cc0 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
20cd0 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
20ce0 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
20cf0 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
20d00 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
20d10 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
20d20 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
20d30 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
20d40 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
20d50 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
20d60 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
20d70 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
20d80 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
20d90 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
20da0 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
20db0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
20dc0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
20dd0 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
20de0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
20df0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
20e00 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
20e10 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
20e20 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
20e30 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
20e40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20e50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
20e60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
20e70 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
20e80 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
20e90 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
20ea0 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
20eb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
20ec0 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
20ed0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
20ee0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
20ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
20f00 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
20f10 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
20f20 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
20f30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20f40 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 63 75   the conch is cu
20f50 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a  rrently held */.
20f60 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
20f70 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
20f80 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
20f90 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
20fa0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
20fb0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
20fc0 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
20fd0 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
20fe0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
20ff0 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
21000 2f 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c  /.};../* HOSTIDL
21010 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20  EN and CONCHLEN 
21020 62 6f 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61  both include spa
21030 63 65 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e  ce for the strin
21040 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e  g .** terminatin
21050 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e  g nul .*/.#defin
21060 65 20 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20  e HOSTIDLEN     
21070 20 20 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20      128.#define 
21080 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20  CONCHLEN        
21090 20 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f    (MAXPATHLEN+HO
210a0 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64  STIDLEN+1).#ifnd
210b0 65 66 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20  ef HOSTIDPATH.# 
210c0 64 65 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54  define HOSTIDPAT
210d0 48 20 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72  H       "/Librar
210e0 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70  y/Caches/.com.ap
210f0 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48  ple.sqliteConchH
21100 6f 73 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f  ostId".#endif../
21110 2a 20 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f  * basically a co
21120 70 79 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d  py of unixRandom
21130 6e 65 73 73 20 77 69 74 68 20 64 69 66 66 65 72  ness with differ
21140 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61  ent.** test beha
21150 76 69 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f  vior built in */
21160 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
21170 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28  yGenerateHostID(
21180 63 68 61 72 20 2a 70 48 6f 73 74 49 44 29 7b 0a  char *pHostID){.
21190 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 6c    int pid, fd, l
211a0 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  en;.  unsigned c
211b0 68 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e 73 69  har *key = (unsi
211c0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 48 6f 73  gned char *)pHos
211d0 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  tID;.  .  memset
211e0 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49 44 4c  (key, 0, HOSTIDL
211f0 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30 3b 0a  EN);.  len = 0;.
21200 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65    fd = open("/de
21210 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
21220 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66 64 3e  ONLY);.  if( fd>
21230 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  =0 ){.    len = 
21240 72 65 61 64 28 66 64 2c 20 6b 65 79 2c 20 48 4f  read(fd, key, HO
21250 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 63 6c  STIDLEN);.    cl
21260 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
21270 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64  ntly leak the fd
21280 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a   if it fails */.
21290 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20 3c 20    }.  if( len < 
212a0 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20  HOSTIDLEN ){.   
212b0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 74   time_t t;.    t
212c0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d 65 6d  ime(&t);.    mem
212d0 63 70 79 28 6b 65 79 2c 20 26 74 2c 20 73 69 7a  cpy(key, &t, siz
212e0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 70 69 64  eof(t));.    pid
212f0 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
21300 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73 69 7a   memcpy(&key[siz
21310 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
21320 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d  izeof(pid));.  }
21330 0a 20 20 0a 23 69 66 64 65 66 20 4d 41 4b 45 5f  .  .#ifdef MAKE_
21340 50 52 45 54 54 59 5f 48 4f 53 54 49 44 0a 20 20  PRETTY_HOSTID.  
21350 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
21360 20 2f 2a 20 66 69 6c 74 65 72 20 74 68 65 20 62   /* filter the b
21370 79 74 65 73 20 69 6e 74 6f 20 70 72 69 6e 74 61  ytes into printa
21380 62 6c 65 20 61 73 63 69 69 20 63 68 61 72 61 63  ble ascii charac
21390 74 65 72 73 20 61 6e 64 20 4e 55 4c 20 74 65 72  ters and NUL ter
213a0 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20 6b 65  minate */.    ke
213b0 79 5b 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 5d  y[(HOSTIDLEN-1)]
213c0 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 66 6f 72   = 0x00;.    for
213d0 28 20 69 3d 30 3b 20 69 3c 28 48 4f 53 54 49 44  ( i=0; i<(HOSTID
213e0 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b 0a 20  LEN-1); i++ ){. 
213f0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
21400 61 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d 26 30  ar pa = key[i]&0
21410 78 37 46 3b 0a 20 20 20 20 20 20 69 66 28 20 70  x7F;.      if( p
21420 61 3c 30 78 32 30 20 29 7b 0a 20 20 20 20 20 20  a<0x20 ){.      
21430 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b    key[i] = (key[
21440 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29  i]&0x80 == 0x80)
21450 20 3f 20 70 61 2b 30 78 34 30 20 3a 20 70 61 2b   ? pa+0x40 : pa+
21460 30 78 32 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0x20;.      }els
21470 65 20 69 66 28 20 70 61 3d 3d 30 78 37 46 20 29  e if( pa==0x7F )
21480 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d  {.        key[i]
21490 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20   = (key[i]&0x80 
214a0 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 3d 30 78  == 0x80) ? pa=0x
214b0 32 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a 20 20  20 : pa+0x7E;.  
214c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
214d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
214e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
214f0 20 77 72 69 74 65 73 20 74 68 65 20 68 6f 73 74   writes the host
21500 20 69 64 20 70 61 74 68 20 74 6f 20 70 61 74 68   id path to path
21510 2c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  , path should be
21520 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65   an pre-allocate
21530 64 20 62 75 66 66 65 72 0a 2a 2a 20 77 69 74 68  d buffer.** with
21540 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f   enough space fo
21550 72 20 61 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  r a path .*/.sta
21560 74 69 63 20 76 6f 69 64 20 70 72 6f 78 79 47 65  tic void proxyGe
21570 74 48 6f 73 74 49 44 50 61 74 68 28 63 68 61 72  tHostIDPath(char
21580 20 2a 70 61 74 68 2c 20 73 69 7a 65 5f 74 20 6c   *path, size_t l
21590 65 6e 29 7b 0a 20 20 73 74 72 6c 63 70 79 28 70  en){.  strlcpy(p
215a0 61 74 68 2c 20 48 4f 53 54 49 44 50 41 54 48 2c  ath, HOSTIDPATH,
215b0 20 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20 53 51   len);.#ifdef SQ
215c0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
215d0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
215e0 75 6d 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  um>0 ){.    char
215f0 20 73 75 66 66 69 78 5b 32 5d 20 3d 20 22 31 22   suffix[2] = "1"
21600 3b 0a 20 20 20 20 73 75 66 66 69 78 5b 30 5d 20  ;.    suffix[0] 
21610 3d 20 73 75 66 66 69 78 5b 30 5d 20 2b 20 73 71  = suffix[0] + sq
21620 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
21630 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28 70 61  ;.    strlcat(pa
21640 74 68 2c 20 73 75 66 66 69 78 2c 20 6c 65 6e 29  th, suffix, len)
21650 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
21660 53 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54  STRACE3("GETHOST
21670 49 44 50 41 54 48 20 20 25 73 20 70 69 64 3d 25  IDPATH  %s pid=%
21680 64 5c 6e 22 2c 20 70 61 74 68 2c 20 67 65 74 70  d\n", path, getp
21690 69 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67 65 74  id());.}../* get
216a0 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 72 6f   the host ID fro
216b0 6d 20 61 20 73 71 6c 69 74 65 20 68 6f 73 74 69  m a sqlite hosti
216c0 64 20 66 69 6c 65 20 73 74 6f 72 65 64 20 69 6e  d file stored in
216d0 20 74 68 65 20 0a 2a 2a 20 75 73 65 72 2d 73 70   the .** user-sp
216e0 65 63 69 66 69 63 20 74 6d 70 20 64 69 72 65 63  ecific tmp direc
216f0 74 6f 72 79 2c 20 63 72 65 61 74 65 20 74 68 65  tory, create the
21700 20 49 44 20 69 66 20 69 74 27 73 20 6e 6f 74 20   ID if it's not 
21710 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 0a 2a  there already .*
21720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
21730 78 79 47 65 74 48 6f 73 74 49 44 28 63 68 61 72  xyGetHostID(char
21740 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
21750 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e 74 20 66  pError){.  int f
21760 64 3b 0a 20 20 63 68 61 72 20 70 61 74 68 5b 4d  d;.  char path[M
21770 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a 20 20 73  AXPATHLEN]; .  s
21780 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20 69 6e 74  ize_t len;.  int
21790 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a   rc=SQLITE_OK;..
217a0 20 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44    proxyGetHostID
217b0 50 61 74 68 28 70 61 74 68 2c 20 4d 41 58 50 41  Path(path, MAXPA
217c0 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79  THLEN);.  /* try
217d0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 68   to create the h
217e0 6f 73 74 20 49 44 20 66 69 6c 65 2c 20 69 66 20  ost ID file, if 
217f0 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
21800 73 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  s read the conte
21810 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  nts */.  fd = op
21820 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45 41 54  en(path, O_CREAT
21830 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c  |O_WRONLY|O_EXCL
21840 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28 20 66  , 0644);.  if( f
21850 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  d<0 ){.    int e
21860 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20  rr=errno;....   
21870 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
21880 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
21890 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a  E_PROXY_DEBUG /*
218a0 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20   set the sqlite 
218b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
218c0 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66  stead */.      f
218d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
218e0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 72 65  sqlite error cre
218f0 61 74 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69  ating host ID fi
21900 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20  le %s: %s\n",.  
21910 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
21920 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29  , strerror(err))
21930 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
21940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
21950 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  M;.    }.    /* 
21960 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
21970 74 68 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69  the file, read i
21980 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20  t instead */.   
21990 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
219a0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c   O_RDONLY|O_EXCL
219b0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
219c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
219d0 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20  _PROXY_DEBUG /* 
219e0 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65  set the sqlite e
219f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73  rror message ins
21a00 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tead */.      in
21a10 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
21a20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
21a30 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72  err, "sqlite err
21a40 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20  or opening host 
21a50 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e  ID file %s: %s\n
21a60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21a70 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28   path, strerror(
21a80 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  err));.#endif.  
21a90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21aa0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20  E_PERM;.    }.  
21ab0 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 66 64    len = pread(fd
21ac0 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49  , pHostID, HOSTI
21ad0 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  DLEN, 0);.    if
21ae0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
21af0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f   *pError = errno
21b00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
21b10 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
21b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
21b30 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  n<HOSTIDLEN ){. 
21b40 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30       *pError = 0
21b50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
21b60 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
21b70 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  READ;.    }.    
21b80 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
21b90 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20  lently leak the 
21ba0 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a  fd if it fails *
21bb0 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  /.    OSTRACE3("
21bc0 47 45 54 48 4f 53 54 49 44 20 20 72 65 61 64 20  GETHOSTID  read 
21bd0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48  %s pid=%d\n", pH
21be0 6f 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29  ostID, getpid())
21bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
21c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21c10 20 77 65 27 72 65 20 63 72 65 61 74 69 6e 67 20   we're creating 
21c20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65  the host ID file
21c30 20 28 75 73 65 20 61 20 72 61 6e 64 6f 6d 20 73   (use a random s
21c40 74 72 69 6e 67 20 6f 66 20 62 79 74 65 73 29 20  tring of bytes) 
21c50 2a 2f 0a 20 20 20 20 70 72 6f 78 79 47 65 6e 65  */.    proxyGene
21c60 72 61 74 65 48 6f 73 74 49 44 28 70 48 6f 73 74  rateHostID(pHost
21c70 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ID);.    len = p
21c80 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73 74 49  write(fd, pHostI
21c90 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29  D, HOSTIDLEN, 0)
21ca0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20  ;.    if( len<0 
21cb0 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
21cc0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
21cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
21ce0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
21cf0 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49  se if( len<HOSTI
21d00 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70  DLEN ){.      *p
21d10 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Error = 0;.     
21d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
21d30 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a  RR_WRITE;.    }.
21d40 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
21d50 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
21d60 74 68 65 20 66 64 20 69 66 20 69 74 20 66 61 69  the fd if it fai
21d70 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ls */.    OSTRAC
21d80 45 33 28 22 47 45 54 48 4f 53 54 49 44 20 20 77  E3("GETHOSTID  w
21d90 72 6f 74 65 20 25 73 20 70 69 64 3d 25 64 5c 6e  rote %s pid=%d\n
21da0 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70  ", pHostID, getp
21db0 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72  id());.    retur
21dc0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  n rc;.  }.}..sta
21dd0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
21de0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
21df0 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
21e00 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
21e10 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
21e20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
21e30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
21e40 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
21e50 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
21e60 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
21e70 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
21e80 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
21e90 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
21ea0 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  _DIR.  {.    con
21eb0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
21ec0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
21ed0 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  Path, maxLen);. 
21ee0 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
21ef0 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70  (lPath, "sqlitep
21f00 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b  locks", maxLen);
21f10 0a 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 6c  .    if( mkdir(l
21f20 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 44 45 46  Path, SQLITE_DEF
21f30 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
21f40 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
21f50 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69 72 20      /* if mkdir 
21f60 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20 61 73  fails, handle as
21f70 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65 61 74   lock file creat
21f80 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  ion failure */. 
21f90 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
21fa0 72 72 6e 6f 3b 0a 23 20 20 69 66 64 65 66 20 53  rrno;.#  ifdef S
21fb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
21fc0 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
21fd0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  T ){.        fpr
21fe0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 70 72  intf(stderr, "pr
21ff0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 3a 20  oxyGetLockPath: 
22000 6d 6b 64 69 72 28 25 73 2c 30 25 6f 29 20 65 72  mkdir(%s,0%o) er
22010 72 6f 72 20 25 64 20 25 73 5c 6e 22 2c 20 6c 50  ror %d %s\n", lP
22020 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
22030 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
22040 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
22050 4d 49 53 53 49 4f 4e 53 2c 20 65 72 72 2c 20 73  MISSIONS, err, s
22060 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 20  trerror(err));. 
22070 20 20 20 20 20 7d 0a 23 20 20 65 6e 64 69 66 0a       }.#  endif.
22080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22090 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f   OSTRACE3("GETLO
220a0 43 4b 50 41 54 48 20 20 6d 6b 64 69 72 20 25 73  CKPATH  mkdir %s
220b0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
220c0 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  h, getpid());.  
220d0 20 20 7d 0a 20 20 20 20 0a 20 20 7d 0a 23 20 65    }.    .  }.# e
220e0 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
220f0 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
22100 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
22110 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
22120 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
22130 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
22140 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
22150 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
22160 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
22170 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
22180 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
22190 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
221a0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
221b0 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
221c0 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
221d0 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65   (i+len+7)<maxLe
221e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
221f0 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
22200 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
22210 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
22220 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
22230 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
22240 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
22250 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
22260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
22280 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
22290 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
222a0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
222b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
222c0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
222d0 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
222e0 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
222f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
22300 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
22310 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
22320 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
22330 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
22340 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22350 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
22360 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
22370 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
22380 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
22390 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
223a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
223b0 61 74 65 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73  ateUnixFile(cons
223c0 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e  t char *path, un
223d0 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29  ixFile **ppFile)
223e0 20 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69   {.  int fd;.  i
223f0 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  nt dirfd = -1;. 
22400 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
22410 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22420 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
22430 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 0a  _vfs dummyVfs;..
22440 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68    fd = open(path
22450 2c 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  , O_RDWR | O_CRE
22460 41 54 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  AT, SQLITE_DEFAU
22470 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
22480 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ONS);.  if( fd<0
22490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
224a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
224b0 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
224c0 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
224d0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
224e0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
224f0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
22500 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22510 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
22520 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
22530 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
22540 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
22550 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
22560 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
22570 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
22580 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
22590 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
225a0 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
225b0 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74  d, dirfd, (sqlit
225c0 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70  e3_file*)pNew, p
225d0 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ath, 0, 0);.  if
225e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
225f0 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d  ){.    *ppFile =
22600 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72   pNew;.    retur
22610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
22620 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78  .end_create_prox
22630 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66  y:    .  close(f
22640 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
22650 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72  leak fd if error
22660 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20  , we're already 
22670 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71  in error */.  sq
22680 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
22690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
226a0 0a 0a 2f 2a 20 74 61 6b 65 73 20 74 68 65 20 63  ../* takes the c
226b0 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
226c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
226d0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
226e0 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
226f0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
22700 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
22710 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
22720 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
22730 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
22740 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
22750 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
22760 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
22770 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
22780 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
22790 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
227a0 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
227b0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
227c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
227d0 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
227e0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
227f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
22800 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
22810 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
22820 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
22830 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
22840 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
22850 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
22860 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
22870 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
22880 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  eld>0 ){.    ret
22890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
228a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
228b0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
228c0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
228d0 65 3b 0a 20 20 20 20 63 68 61 72 20 74 65 73 74  e;.    char test
228e0 56 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b  Value[CONCHLEN];
228f0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 63 68 56  .    char conchV
22900 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  alue[CONCHLEN];.
22910 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
22920 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
22930 20 20 20 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61     char *tLockPa
22940 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
22950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22960 4b 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 52  K;.    int readR
22970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22980 20 20 20 69 6e 74 20 73 79 6e 63 50 65 72 6d 73     int syncPerms
22990 20 3d 20 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41   = 0;..    OSTRA
229a0 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE4("TAKECONCH  
229b0 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
229c0 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
229d0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
229e0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
229f0 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
22a00 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
22a10 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
22a20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  );..    rc = con
22a30 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
22a40 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
22a50 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
22a60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
22a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
22a90 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
22aa0 20 20 20 20 6d 65 6d 73 65 74 28 74 65 73 74 56      memset(testV
22ab0 61 6c 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45  alue, 0, CONCHLE
22ac0 4e 29 3b 20 2f 2a 20 63 6f 6e 63 68 20 69 73 20  N); /* conch is 
22ad0 66 69 78 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20  fixed size */.  
22ae0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
22af0 74 48 6f 73 74 49 44 28 74 65 73 74 56 61 6c 75  tHostID(testValu
22b00 65 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  e, &pError);.   
22b10 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
22b20 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
22b30 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
22b40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
22b50 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
22b60 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
22b70 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
22b80 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 74        strlcpy(&t
22b90 65 73 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c  estValue[HOSTIDL
22ba0 45 4e 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EN], pCtx->lockP
22bb0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
22bc0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  HLEN);.      }. 
22bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
22be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22bf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
22c00 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
22c10 20 20 0a 20 20 20 20 72 65 61 64 52 63 20 3d 20    .    readRc = 
22c20 75 6e 69 78 52 65 61 64 28 28 73 71 6c 69 74 65  unixRead((sqlite
22c30 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
22c40 6c 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20  le, conchValue, 
22c50 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
22c60 20 20 69 66 28 20 72 65 61 64 52 63 21 3d 53 51    if( readRc!=SQ
22c70 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
22c80 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 69  _READ ){.      i
22c90 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54  f( readRc!=SQLIT
22ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22cb0 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
22cc0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
22cd0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
22ce0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
22cf0 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
22d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22d10 20 20 20 20 72 63 20 3d 20 72 65 61 64 52 63 3b      rc = readRc;
22d20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
22d30 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
22d40 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66     }.      /* if
22d50 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
22d60 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
22d70 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
22d80 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
22d90 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
22da0 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74        /* for aut
22db0 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f  o-named local lo
22dc0 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68  ck file, just ch
22dd0 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20  eck the host ID 
22de0 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20  and we'll.      
22df0 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
22e00 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
22e10 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
22e20 79 20 69 6e 20 74 68 65 72 65 20 2a 2f 0a 20 20  y in there */.  
22e30 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d        if( !memcm
22e40 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e  p(testValue, con
22e50 63 68 56 61 6c 75 65 2c 20 48 4f 53 54 49 44 4c  chValue, HOSTIDL
22e60 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
22e70 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 28 63 68   tLockPath = (ch
22e80 61 72 20 2a 29 26 63 6f 6e 63 68 56 61 6c 75 65  ar *)&conchValue
22e90 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a 20 20 20  [HOSTIDLEN];.   
22ea0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22eb0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
22ec0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
22ed0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 65 27  {.        /* we'
22ee0 76 65 20 67 6f 74 20 74 68 65 20 63 6f 6e 63 68  ve got the conch
22ef0 20 69 66 20 63 6f 6e 63 68 56 61 6c 75 65 20 6d   if conchValue m
22f00 61 74 63 68 65 73 20 6f 75 72 20 70 61 74 68 20  atches our path 
22f10 61 6e 64 20 68 6f 73 74 20 49 44 20 2a 2f 0a 20  and host ID */. 
22f20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63         if( !memc
22f30 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f  mp(testValue, co
22f40 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c  nchValue, CONCHL
22f50 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
22f60 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
22f70 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nch;.        }. 
22f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22f90 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
22fa0 72 74 20 72 65 61 64 20 6d 65 61 6e 73 20 77 65  rt read means we
22fb0 27 72 65 20 22 63 72 65 61 74 69 6e 67 22 20 74  're "creating" t
22fc0 68 65 20 63 6f 6e 63 68 20 28 65 76 65 6e 20 74  he conch (even t
22fd0 68 6f 75 67 68 20 69 74 20 63 6f 75 6c 64 20 0a  hough it could .
22fe0 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
22ff0 65 6e 20 75 73 65 72 2d 69 6e 74 65 72 76 65 6e  en user-interven
23000 74 69 6f 6e 29 2c 20 69 66 20 77 65 20 61 63 71  tion), if we acq
23010 75 69 72 65 20 74 68 65 20 65 78 63 6c 75 73 69  uire the exclusi
23020 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 2a  ve lock,.      *
23030 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 6d  * we'll try to m
23040 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e 74  atch the current
23050 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d 69 73 73   on-disk permiss
23060 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
23070 62 61 73 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  base.      */.  
23080 20 20 20 20 73 79 6e 63 50 65 72 6d 73 20 3d 20      syncPerms = 
23090 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  1;.    }.    .  
230a0 20 20 2f 2a 20 65 69 74 68 65 72 20 63 6f 6e 63    /* either conc
230b0 68 20 77 61 73 20 65 6d 74 70 79 20 6f 72 20 64  h was emtpy or d
230c0 69 64 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  idn't match */. 
230d0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
230e0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
230f0 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
23100 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
23110 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
23120 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
23130 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63   tLockPath = loc
23140 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72  kPath;.      str
23150 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b  lcpy(&testValue[
23160 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b  HOSTIDLEN], lock
23170 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
23180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  );.    }.    .  
23190 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
231a0 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
231b0 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
231c0 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
231d0 6f 63 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61  ocess.     ** ha
231e0 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
231f0 61 6c 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20  already) */.    
23200 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
23210 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
23220 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
23230 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
23240 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  VE_LOCK);.    if
23250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23260 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
23270 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33  ixWrite((sqlite3
23280 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
23290 65 2c 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f  e, testValue, CO
232a0 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
232b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
232c0 5f 4f 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73  _OK && syncPerms
232d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
232e0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
232f0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66       int err = f
23300 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
23310 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  buf);.        if
23320 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ( err==0 ){.    
23330 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20        /* try to 
23340 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
23350 73 65 20 66 69 6c 65 20 70 65 72 6d 69 73 73 69  se file permissi
23360 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
23370 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
23380 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
23390 47 0a 20 20 20 20 20 20 20 20 20 20 66 63 68 6d  G.          fchm
233a0 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
233b0 20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23   buf.st_mode);.#
233c0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 69  else.          i
233d0 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46  f( fchmod(conchF
233e0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d  ile->h, buf.st_m
233f0 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ode)!=0 ){.     
23400 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
23410 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
23420 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
23430 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
23440 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
23450 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20     buf.st_mode, 
23480 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
23490 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
234a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
234b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
234c0 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
234d0 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 62 75 66   SUCCEDED\n",buf
234e0 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20  .st_mode);.     
234f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23510 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
23520 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
23530 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41  ntf(stderr, "STA
23540 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74  T FAILED[%d] wit
23550 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20  h %d %s\n", .   
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
23580 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
23590 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
235a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
235b0 7d 0a 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d  }.    conchFile-
235c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
235d0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
235e0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
235f0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64  ED_LOCK);.  .end
23600 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
23610 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50  OSTRACE2("TRANSP
23620 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
23630 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
23640 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23650 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f  E_OK && pFile->o
23660 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  penFlags ){.    
23670 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
23680 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49  0 ){.#ifdef STRI
23690 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20  CT_CLOSE_ERROR. 
236a0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
236b0 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
236c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
236d0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
236e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
236f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23700 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 7d  CLOSE;.        }
23710 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 63  .#else.        c
23720 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20  lose(pFile->h); 
23730 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
23740 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23   fd if fail */.#
23750 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
23760 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
23770 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 64 20  1;.      int fd 
23780 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50  = open(pCtx->dbP
23790 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  ath, pFile->open
237a0 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
237b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
237c0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
237d0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
237e0 20 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41     OSTRACE2("TRA
237f0 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
23800 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20  d\n", fd);.     
23810 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
23820 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
23830 20 66 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   fd;.      }else
23840 7b 0a 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c  {.        rc=SQL
23850 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2a  ITE_CANTOPEN; /*
23860 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72   SQLITE_BUSY? pr
23870 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c  oxyTakeConch cal
23880 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
238b0 67 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  g */.      }.   
238c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
238d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
238e0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
238f0 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
23900 20 3d 20 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74   = tLockPath ? t
23910 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
23920 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
23930 20 20 20 20 20 20 2f 2a 20 41 43 53 3a 20 4e 65        /* ACS: Ne
23940 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
23950 79 20 6f 66 20 70 61 74 68 20 73 6f 6d 65 74 69  y of path someti
23960 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  mes */.      rc 
23970 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
23980 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
23990 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  x->lockProxy);. 
239a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
239b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
239c0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
239d0 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  eld = 1;..      
239e0 69 66 28 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b  if( tLockPath ){
239f0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  .        pCtx->l
23a00 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
23a10 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
23a20 2c 20 74 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  , tLockPath);.  
23a30 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
23a40 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
23a50 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
23a60 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
23a70 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
23a80 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63  text *)pCtx->loc
23a90 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43  kProxy->lockingC
23aa0 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 20  ontext)->dbPath 
23ab0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
23ac0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
23ad0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
23ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23af0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
23b00 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
23b10 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
23b20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
23b30 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
23b40 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41  .    }.    OSTRA
23b50 43 45 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE3("TAKECONCH  
23b60 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
23b70 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49  ile->h, rc==SQLI
23b80 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c  TE_OK?"ok":"fail
23b90 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
23ba0 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
23bb0 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
23bc0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
23bd0 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
23be0 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
23bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
23c00 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
23c10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
23c20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
23c50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23c60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
23c70 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
23c80 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
23c90 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
23ca0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
23cb0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
23cc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23cd0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
23ce0 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
23cf0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
23d00 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
23d10 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
23d20 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
23d30 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
23d40 52 41 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f  RACE4("RELEASECO
23d50 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
23d60 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
23d70 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
23d80 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
23d90 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
23da0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
23db0 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
23dc0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
23dd0 3b 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  ;.  pCtx->conchH
23de0 65 6c 64 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  eld = 0;.  rc = 
23df0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
23e00 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
23e10 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
23e20 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
23e30 20 20 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45    OSTRACE3("RELE
23e40 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
23e50 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
23e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
23e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
23e80 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
23e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23ea0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
23eb0 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
23ec0 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
23ed0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
23ee0 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
23ef0 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
23f00 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
23f10 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
23f20 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
23f30 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
23f40 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
23f50 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
23f60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23f70 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
23f80 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
23f90 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
23fa0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
23fb0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
23fc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
23fd0 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
23fe0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
23ff0 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
24000 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
24010 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
24020 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
24030 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
24040 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
24050 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
24060 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
24070 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
24080 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
24090 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
240a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
240c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
240d0 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
240e0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
240f0 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
24100 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
24110 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
24120 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24140 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
24150 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
24160 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
24170 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
24180 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
24190 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
241a0 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
241b0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
241c0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
241d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
241e0 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
241f0 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
24200 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24210 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
24220 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
24230 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
24240 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24250 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
24260 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
24270 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
24280 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
24290 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
242a0 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
242b0 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
242c0 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
242d0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
242e0 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
242f0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
24300 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
24310 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
24320 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
24330 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
24340 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
24350 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
24360 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
24370 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
24380 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
24390 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
243a0 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
243b0 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
243c0 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
243d0 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
243e0 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
243f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
24400 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
24410 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
24420 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
24430 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
24440 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
24450 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
24460 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
24470 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
24480 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
24490 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
244a0 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
244b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
244c0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
244d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
244e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
244f0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
24500 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
24510 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
24520 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24530 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
24540 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
24550 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
24560 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
24570 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
24580 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
24590 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
245a0 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
245b0 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
245c0 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
245d0 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
245e0 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
245f0 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
24600 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
24610 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
24620 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
24630 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
24640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
24650 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
24660 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
24670 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
24680 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
24690 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
246a0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
246b0 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
246c0 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
246d0 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
246e0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
246f0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
24700 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
24710 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24720 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
24730 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
24740 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
24750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
24760 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
24770 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
24780 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
24790 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
247a0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
247b0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
247c0 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
247d0 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
247e0 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
247f0 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
24800 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
24810 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
24820 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
24830 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
24840 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24850 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
24860 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
24870 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
24880 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
24890 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
248a0 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
248b0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
248c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
248d0 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
248e0 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
248f0 4e 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  N__).  if( pFile
24900 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
24910 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
24920 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
24930 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
24940 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
24950 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
24960 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
24970 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
24980 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
24990 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
249a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
249b0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
249c0 20 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64   );.    strcpy(d
249d0 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b  bPath, ((afpLock
249e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
249f0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
24a00 78 74 29 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20  xt)->dbPath);.  
24a10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69  }else.#endif.  i
24a20 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
24a30 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  d == &dotlockIoM
24a40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
24a50 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20   dot lock style 
24a60 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  uses the locking
24a70 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
24a80 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20  e the dot lock. 
24a90 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20     ** file path 
24aa0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  */.    int len =
24ab0 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
24ac0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
24ad0 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28  ntext) - strlen(
24ae0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b  DOTLOCK_SUFFIX);
24af0 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61  .    memcpy(dbPa
24b00 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
24b10 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
24b20 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d  t, len + 1);.  }
24b30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  else{.    /* all
24b40 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73   other styles us
24b50 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  e the locking co
24b60 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
24b70 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20  he db file path 
24b80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
24b90 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
24ba0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
24bb0 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
24bc0 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64 62  );.    strcpy(db
24bd0 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
24be0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
24bf0 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ext);.  }.  retu
24c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24c10 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
24c20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
24c30 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
24c40 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
24c50 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
24c60 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
24c70 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
24c80 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
24c90 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
24ca0 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
24cb0 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
24cc0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
24cd0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
24ce0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
24cf0 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
24d00 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
24d10 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
24d20 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
24d30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
24d40 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
24d50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
24d60 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
24d70 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
24d80 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
24d90 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
24da0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
24db0 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
24dc0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
24dd0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
24de0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24df0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
24e00 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
24e10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e20 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
24e30 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
24e40 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
24e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
24e60 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74  ;.  }.  proxyGet
24e70 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
24e80 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
24e90 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
24ea0 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
24eb0 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
24ec0 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
24ed0 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
24ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
24ef0 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
24f00 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
24f10 52 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58  RACE4("TRANSPROX
24f20 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
24f30 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
24f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
24f50 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
24f60 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
24f70 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74  etpid());..  pCt
24f80 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
24f90 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
24fa0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
24fb0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24fc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24fd0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
24fe0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
24ff0 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
25000 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
25010 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
25020 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
25030 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
25040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25050 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
25060 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
25070 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
25080 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
25090 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d  .  }  .  if( rc=
250a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f  =SQLITE_OK && lo
250b0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43  ckPath ){.    pC
250c0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
250d0 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
250e0 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29  Dup(0, lockPath)
250f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
25100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25110 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20    /* all memory 
25120 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72  is allocated, pr
25130 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64  oxys are created
25140 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a   and assigned, .
25150 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68      ** switch th
25160 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
25170 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
25180 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a  en return..    *
25190 2f 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  /.    pCtx->dbPa
251a0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
251b0 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
251c0 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  .    pCtx->oldLo
251d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
251e0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
251f0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
25200 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
25210 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78  = pCtx;.    pCtx
25220 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70  ->pOldMethod = p
25230 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20  File->pMethod;. 
25240 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
25250 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68  d = &proxyIoMeth
25260 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
25270 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
25280 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20  hFile ){ .      
25290 72 63 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  rc = pCtx->conch
252a0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
252b0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
252c0 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
252d0 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  hFile);.      if
252e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
252f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
25300 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
25310 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
25320 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
25330 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
25340 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33  h); .    sqlite3
25350 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d  _free(pCtx);.  }
25360 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 52 41  .  OSTRACE3("TRA
25370 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e  NSPROXY  %d %s\n
25380 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
25390 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c          (rc==SQL
253a0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
253b0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
253c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
253d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
253e0 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f  handles sqlite3_
253f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63  file_control() c
25400 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70  alls that are sp
25410 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f  ecific.** to pro
25420 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  xy locking..*/.s
25430 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
25440 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
25450 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
25460 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
25470 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
25480 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
25490 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
254a0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ILE: {.      uni
254b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
254c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
254d0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
254e0 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79  Method == &proxy
254f0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
25500 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
25510 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
25520 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
25530 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
25540 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
25550 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43        proxyTakeC
25560 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
25570 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
25580 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
25590 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
255a0 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
255b0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
255c0 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65  Path;.        }e
255d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
255e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
255f0 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e  Arg = ":auto: (n
25600 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20  ot held)";.     
25610 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
25620 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f  e {.        *(co
25630 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
25640 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d   = NULL;.      }
25650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25670 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
25680 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
25690 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
256a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
256b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
256c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
256d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  _OK;.      int i
256e0 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70  sProxyStyle = (p
256f0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
25700 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
25710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
25720 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73  g==NULL || (cons
25730 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30  t char *)pArg==0
25740 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25750 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a  isProxyStyle ){.
25760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
25770 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b  n off proxy lock
25780 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72  ing - not suppor
25790 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
257a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
257b0 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54  OR /*SQLITE_PROT
257c0 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53  OCOL? SQLITE_MIS
257d0 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20  USE?*/;.        
257e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
257f0 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
25800 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72  xy locking - alr
25810 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20  eady off - NOOP 
25820 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
25830 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
25850 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
25860 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74  t char *proxyPat
25870 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  h = (const char 
25880 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
25890 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
258a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
258b0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
258c0 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20  t *pCtx = .     
258d0 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63         (proxyLoc
258e0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
258f0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
25900 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  xt;.          if
25910 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20  ( !strcmp(pArg, 
25920 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20  ":auto:") .     
25930 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e        || (pCtx->
25940 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26  lockProxyPath &&
25950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25960 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
25970 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72  ockProxyPath, pr
25980 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
25990 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20  LEN)).          
259a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
259b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
259c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
259d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
259e0 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
259f0 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78  Path(pFile, prox
25a00 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
25a10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
25a20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
25a30 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69  turn on proxy fi
25a40 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  le locking */.  
25a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
25a60 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
25a70 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79  ile(pFile, proxy
25a80 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d  Path);.        }
25a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
25aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25ab0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
25ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
25ad0 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61  ;  /* The call a
25ae0 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79  ssures that only
25af0 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61   valid opcodes a
25b00 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d  re sent */.    }
25b10 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
25b20 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  HED*/.  return S
25b30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
25b40 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  /*.** Within thi
25b50 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20  s division (the 
25b60 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
25b70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
25b80 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a   the procedures.
25b90 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f  ** above this po
25ba0 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c  int are all util
25bb0 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b  ities.  The lock
25bc0 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73  -related methods
25bd0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   of the.** proxy
25be0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
25bf0 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63  _io_method objec
25c00 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f  t follow..*/.../
25c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25c20 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
25c30 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
25c40 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
25c50 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
25c60 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
25c70 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
25c80 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
25c90 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
25ca0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
25cb0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
25cc0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
25cd0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
25ce0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
25cf0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
25d00 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
25d10 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
25d20 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
25d30 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
25d40 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
25d50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
25d60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
25d70 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
25d80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
25d90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
25da0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
25db0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
25dc0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
25dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25de0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
25df0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
25e00 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
25e10 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
25e20 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
25e30 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
25e40 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
25e50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f  ;.    return pro
25e60 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68  xy->pMethod->xCh
25e70 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
25e80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
25e90 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a  roxy, pResOut);.
25ea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
25ec0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
25ed0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
25ee0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
25ef0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
25f00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
25f10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
25f20 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
25f30 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
25f40 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
25f50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
25f60 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
25f70 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
25f80 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
25f90 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
25fa0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
25fb0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
25fc0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
25fd0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
25fe0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
25ff0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
26000 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
26010 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
26020 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
26030 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
26040 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
26050 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
26060 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
26070 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
26080 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
26090 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
260a0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
260b0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
260c0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
260d0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
260e0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
260f0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
26100 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
26110 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
26120 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
26130 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
26140 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
26150 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
26160 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
26170 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
26180 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
26190 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
261a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
261b0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
261c0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
261d0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
261e0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
261f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
26200 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
26210 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
26220 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
26230 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
26240 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
26250 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
26260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
26270 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
26280 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
26290 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
262a0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
262b0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78  ontext;.    unix
262c0 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
262d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
262e0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
262f0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
26300 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
26310 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
26320 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
26330 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b  pe = proxy->lock
26340 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  type;.  }.  retu
26350 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
26360 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
26370 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
26380 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
26390 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
263a0 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
263b0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
263c0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
263d0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
263e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
263f0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
26400 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
26410 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
26420 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
26430 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
26440 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
26450 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
26460 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
26470 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
26480 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
26490 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
264a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
264b0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
264c0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
264d0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
264e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
264f0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
26500 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
26510 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
26520 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
26530 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
26540 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
26550 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
26560 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ;.    rc = proxy
26570 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
26580 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
26590 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70  *)proxy, locktyp
265a0 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  e);.    pFile->l
265b0 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d  ocktype = proxy-
265c0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20  >locktype;.  }. 
265d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
265e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
265f0 65 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78  e that uses prox
26600 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  y locks..*/.stat
26610 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
26620 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
26630 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
26640 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
26650 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
26660 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79  e*)id;.    proxy
26670 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
26680 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
26690 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
266a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
266b0 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  ext;.    unixFil
266c0 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
266d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
266e0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
266f0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
26700 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69  conchFile;.    i
26710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26720 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  K;.    .    if( 
26730 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
26740 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
26750 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  y->pMethod->xUnl
26760 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
26770 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f  e*)lockProxy, NO
26780 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
26790 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
267a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  ;.      rc = loc
267b0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
267c0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
267d0 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
267e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
267f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26800 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26810 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
26820 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
26830 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
26840 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29   if( conchFile )
26850 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  {.      if( pCtx
26860 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20  ->conchHeld ){. 
26870 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
26880 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46  yReleaseConch(pF
26890 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ile);.        if
268a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
268b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
268c0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
268d0 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
268e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
268f0 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  onchFile);.     
26900 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
26910 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
26920 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c  e3_free(conchFil
26930 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
26940 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
26950 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
26960 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26970 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
26980 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
26990 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64  te3_free(pCtx->d
269a0 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72  bPath);.    /* r
269b0 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69  estore the origi
269c0 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  nal locking cont
269d0 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
269e0 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f  then close it */
269f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
26a00 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
26a10 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
26a20 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
26a30 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d  >pMethod = pCtx-
26a40 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20  >pOldMethod;.   
26a50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
26a60 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tx);.    return 
26a70 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
26a80 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a  xClose(id);.  }.
26a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26aa0 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20  OK;.}....#endif 
26ab0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52  /* defined(__DAR
26ac0 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  WIN__) && SQLITE
26ad0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
26ae0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
26af0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
26b00 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
26b10 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
26b20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
26b30 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
26b40 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
26b50 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
26b60 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
26b70 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
26b80 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
26b90 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
26ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
26bb0 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
26bc0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
26bd0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
26be0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
26bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c30 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
26c40 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
26c50 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
26c60 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
26c70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
26c80 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
26c90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
26ca0 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
26cb0 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
26cc0 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
26cd0 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
26ce0 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
26cf0 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
26d00 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
26d10 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
26d20 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
26d30 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
26d40 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
26d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
26d60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
26d70 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
26d80 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
26d90 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
26da0 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
26db0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
26dc0 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
26dd0 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
26de0 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
26df0 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
26e00 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
26e10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
26e20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
26e30 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
26e40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26e50 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
26e60 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
26e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
26e80 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
26e90 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
26ea0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
26eb0 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
26ec0 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
26ed0 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
26ee0 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
26ef0 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
26f00 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
26f10 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
26f20 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
26f30 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
26f40 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
26f50 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
26f60 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
26f70 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
26f80 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
26f90 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
26fa0 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
26fb0 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
26fc0 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
26fd0 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
26fe0 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
26ff0 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
27000 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
27010 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
27020 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
27030 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
27040 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
27050 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
27060 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
27070 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
27080 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
27090 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
270a0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
270b0 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
270c0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
270d0 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
270e0 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
270f0 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
27100 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
27110 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
27120 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
27130 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
27140 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
27150 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
27160 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
27170 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
27180 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
27190 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
271a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
271b0 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
271c0 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
271d0 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
271e0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
271f0 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
27200 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
27210 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
27220 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
27230 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
27240 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
27250 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
27260 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
27270 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
27280 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
27290 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
272a0 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
272b0 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
272c0 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
272d0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
272e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31           \.    1
272f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27300 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
27310 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
27320 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
27330 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
27340 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
27350 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27360 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
27370 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
27380 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
27390 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
273a0 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
273c0 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27400 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27420 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
27430 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
27440 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27460 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
27470 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
27480 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
27490 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
274a0 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
274b0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
274c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
274d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
274e0 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
274f0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
27500 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
27510 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
27520 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
27530 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
27540 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
27550 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
27560 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
27570 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
275a0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
275b0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
275e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
275f0 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27610 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
27620 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
27630 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27650 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
27660 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
27670 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
27680 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
27690 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
276a0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
276b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
276c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
276d0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
276e0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
276f0 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
27700 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
27710 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  xGetLastError   
27720 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
27730 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
27740 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
27750 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
27760 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
27770 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
27780 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
27790 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
277a0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
277b0 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
277c0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
277d0 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
277e0 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
277f0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
27800 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
27810 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
27820 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
27830 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
27840 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
27850 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
27860 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
27870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
27880 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
27890 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
278a0 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  _).    UNIXVFS("
278b0 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
278c0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
278d0 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e   ),.#else.    UN
278e0 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
278f0 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69         posixIoFi
27900 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
27910 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
27920 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f  -none",     nolo
27930 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ckIoFinder ),.  
27940 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
27950 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f  dotfile",  dotlo
27960 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ckIoFinder ),.#i
27970 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
27980 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
27990 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46  amedsem", semIoF
279a0 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
279b0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
279c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
279d0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
279e0 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73  x-posix",    pos
279f0 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ixIoFinder ),.  
27a00 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
27a10 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b  flock",    flock
27a20 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
27a30 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
27a40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27a50 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
27a60 44 41 52 57 49 4e 5f 5f 29 0a 20 20 20 20 55 4e  DARWIN__).    UN
27a70 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
27a80 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64  ,      afpIoFind
27a90 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
27aa0 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20  S("unix-proxy", 
27ab0 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72     proxyIoFinder
27ac0 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   ),.#endif.  };.
27ad0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
27ae0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
27af0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
27b00 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
27b10 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69   VFSes defined i
27b20 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72  n the aVfs[] arr
27b30 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ay */.  for(i=0;
27b40 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29   i<(sizeof(aVfs)
27b50 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  /sizeof(sqlite3_
27b60 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  vfs)); i++){.   
27b70 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
27b80 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20  ister(&aVfs[i], 
27b90 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
27ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
27bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
27bc0 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  n the operating 
27bd0 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
27be0 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65  ..**.** Some ope
27bf0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d  rating systems m
27c00 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20  ight need to do 
27c10 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20  some cleanup in 
27c20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  this routine,.**
27c30 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61   to release dyna
27c40 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
27c50 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20  d objects.  But 
27c60 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20  not on unix..** 
27c70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27c80 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78  a no-op for unix
27c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27ca0 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
27cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27cc0 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20  OK; .}. .#endif 
27cd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  /* SQLITE_OS_UNI
27ce0 58 20 2a 2f 0a                                   X */.