/ Hex Artifact Content
Login

Artifact e55d977c516ed880a2f83f0610b019efd9f8bc06:


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 35 31 20 32 30 30 39 2f 30  c,v 1.251 2009/0
0810: 35 2f 30 38 20 31 31 3a 33 34 3a 33 37 20 64 61  5/08 11:34:37 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: 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65  APPLE__).#    de
0b10: 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
0b20: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0b30: 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   1.#  else.#    
0b40: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
0b50: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0b60: 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65  LE 0.#  endif.#e
0b70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
0b80: 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b  ne the OS_VXWORK
0b90: 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20  S pre-processor 
0ba0: 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20 62 75  macro to 1 if bu
0bb0: 69 6c 64 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78  ilding on .** vx
0bc0: 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65  works, or 0 othe
0bd0: 72 77 69 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rwise..*/.#ifnde
0be0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20  f OS_VXWORKS.#  
0bf0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  if defined(__RTP
0c00: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
0c10: 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20  WRS_KERNEL).#   
0c20: 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52   define OS_VXWOR
0c30: 4b 53 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  KS 1.#  else.#  
0c40: 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f    define OS_VXWO
0c50: 52 4b 53 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  RKS 0.#  endif.#
0c60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0c70: 73 65 20 23 64 65 66 69 6e 65 73 20 73 68 6f 75  se #defines shou
0c80: 6c 64 20 65 6e 61 62 6c 65 20 3e 32 47 42 20 66  ld enable >2GB f
0c90: 69 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e 20 50  ile support on P
0ca0: 6f 73 69 78 20 69 66 20 74 68 65 0a 2a 2a 20 75  osix if the.** u
0cb0: 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
0cc0: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
0cd0: 72 74 73 20 69 74 2e 20 20 49 66 20 74 68 65 20  rts it.  If the 
0ce0: 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67  OS lacks.** larg
0cf0: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 2c 20  e file support, 
0d00: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65 20  these should be 
0d10: 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61  no-ops..**.** La
0d20: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
0d30: 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64   can be disabled
0d40: 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53 51 4c   using the -DSQL
0d50: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
0d60: 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65  switch.** on the
0d70: 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e   compiler comman
0d80: 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20 69 73  d line.  This is
0d90: 20 6e 65 63 65 73 73 61 72 79 20 69 66 20 79 6f   necessary if yo
0da0: 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a  u are compiling.
0db0: 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d  ** on a recent m
0dc0: 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48  achine (ex: RedH
0dd0: 61 74 20 37 2e 32 29 20 62 75 74 20 79 6f 75 20  at 7.2) but you 
0de0: 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65 20 74  want your code t
0df0: 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20  o work.** on an 
0e00: 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20 28 65  older machine (e
0e10: 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29 2e 20  x: RedHat 6.0). 
0e20: 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20   If you compile 
0e30: 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a  on RedHat 7.2.**
0e40: 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 6f 70   without this op
0e50: 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61  tion, LFS is ena
0e60: 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20 64 6f  ble.  But LFS do
0e70: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20  es not exist in 
0e80: 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e  the kernel.** in
0e90: 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73 6f 20   RedHat 6.0, so 
0ea0: 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20 77  the code won't w
0eb0: 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72  ork.  Hence, for
0ec0: 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a   maximum binary.
0ed0: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 79  ** portability y
0ee0: 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c  ou should omit L
0ef0: 46 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  FS..**.** The pr
0f00: 65 76 69 6f 75 73 20 70 61 72 61 67 72 61 70 68  evious paragraph
0f10: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 20   was written in 
0f20: 32 30 30 35 2e 20 20 28 54 68 69 73 20 70 61 72  2005.  (This par
0f30: 61 67 72 61 70 68 20 69 73 20 77 72 69 74 74 65  agraph is writte
0f40: 6e 0a 2a 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d  n.** on 2008-11-
0f50: 32 38 2e 29 20 54 68 65 73 65 20 64 61 79 73 2c  28.) These days,
0f60: 20 61 6c 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65   all Linux kerne
0f70: 6c 73 20 73 75 70 70 6f 72 74 20 6c 61 72 67 65  ls support large
0f80: 20 66 69 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f   files, so.** yo
0f90: 75 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  u should probabl
0fa0: 79 20 6c 65 61 76 65 20 4c 46 53 20 65 6e 61 62  y leave LFS enab
0fb0: 6c 65 64 2e 20 20 42 75 74 20 73 6f 6d 65 20 65  led.  But some e
0fc0: 6d 62 65 64 64 65 64 20 70 6c 61 74 66 6f 72 6d  mbedded platform
0fd0: 73 20 6d 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20  s might.** lack 
0fe0: 4c 46 53 20 69 6e 20 77 68 69 63 68 20 63 61 73  LFS in which cas
0ff0: 65 20 74 68 65 20 53 51 4c 49 54 45 5f 44 49 53  e the SQLITE_DIS
1000: 41 42 4c 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d  ABLE_LFS macro m
1010: 69 67 68 74 20 73 74 69 6c 6c 20 62 65 20 75 73  ight still be us
1020: 65 66 75 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  eful..*/.#ifndef
1030: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
1040: 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41  LFS.# define _LA
1050: 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20 20 31  RGE_FILE       1
1060: 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f  .# ifndef _FILE_
1070: 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20 20 20  OFFSET_BITS.#   
1080: 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46  define _FILE_OFF
1090: 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20 65 6e  SET_BITS 64.# en
10a0: 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41  dif.# define _LA
10b0: 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45 20 31  RGEFILE_SOURCE 1
10c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73  .#endif../*.** s
10d0: 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65 20  tandard include 
10e0: 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  files..*/.#inclu
10f0: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
1100: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
1110: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
1120: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75  <fcntl.h>.#inclu
1130: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
1140: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
1150: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
1160: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
1170: 65 72 72 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53 51  errno.h>..#if SQ
1180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1190: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
11a0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
11b0: 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  >.# if OS_VXWORK
11c0: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
11d0: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
11e0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
11f0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
1200: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
1210: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
1220: 70 61 72 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c  param.h>.#  incl
1230: 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68  ude <sys/mount.h
1240: 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  >.# endif.#endif
1250: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1270: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  */../*.** If we 
1280: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
1290: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
12a0: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
12b0: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
12c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
12d0: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
12e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
12f0: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
1300: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
1310: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
1320: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
1330: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
1340: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
1350: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
1360: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
1370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1380: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1390: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
13a0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
13b0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
13c0: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a  4.#endif../*. **
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69  ng auto proxy di
1400: 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r. */.#ifndef SQ
1410: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1420: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1430: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1440: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1450: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
1460: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
1470: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1480: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
1490: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
14a0: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
14b0: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
14c0: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
14d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
14e0: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
14f0: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1500: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1510: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
1520: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
1530: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
1540: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
1550: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
1560: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
1570: 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a  E_BUSY)).../*.**
1580: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1590: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
15a0: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
15b0: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
15c0: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
15d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
15e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
15f0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
1600: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
1610: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
1620: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1630: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1640: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1650: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72  t entry */.  str
1660: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
1670: 2a 70 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a  *pOpen;       /*
1680: 20 49 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20   Info about all 
1690: 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69  open fd's on thi
16a0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72  s inode */.  str
16b0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
16c0: 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a   *pLock;      /*
16d0: 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b   Info about lock
16e0: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
16f0: 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 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 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
1720: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1730: 20 20 69 6e 74 20 64 69 72 66 64 3b 20 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 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1760: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
1770: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73  rectory */.  uns
1780: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
1790: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
17a0: 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   The type of loc
17b0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  k held on this f
17c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45  d */.  int lastE
17d0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
17f0: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  nix errno from t
1800: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
1810: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
1820: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69          /* Locki
1840: 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng style specifi
1850: 63 20 73 74 61 74 65 20 2a 2f 0a 23 69 66 20 53  c state */.#if S
1860: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1870: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1880: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
18b0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
18c0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
18d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
18e0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
18f0: 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74  x__).  pthread_t
1900: 20 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   tid;           
1910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1920: 68 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73  hread that "owns
1930: 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  " this unixFile 
1940: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1950: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69  _VXWORKS.  int i
1960: 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20  sDelete;        
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1980: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69  elete on close i
1990: 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72 75  f true */.  stru
19a0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
19b0: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *pId;       /* 
19c0: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
19d0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  /.#endif.#ifndef
19e0: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65   NDEBUG.  /* The
19f0: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76   next group of v
1a00: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
1a10: 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68  d to track wheth
1a20: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20  er or not the.  
1a30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
1a40: 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20  ounter in bytes 
1a50: 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73  24-27 of databas
1a60: 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61  e files are upda
1a70: 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65  ted.  ** wheneve
1a80: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
1a90: 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  e database chang
1aa0: 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f  es.  An assertio
1ab0: 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a  n fault will.  *
1ac0: 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c  * occur if a fil
1ad0: 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  e is updated wit
1ae0: 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69  hout also updati
1af0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1b00: 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e  on.  ** counter.
1b10: 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d    This test is m
1b20: 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77  ade to avoid new
1b30: 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61   problems simila
1b40: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e  r to the.  ** on
1b50: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
1b60: 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20  icket #3584. .  
1b70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1b80: 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  ar transCntrChng
1b90: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
1ba0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1bb0: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a  ounter changed *
1bc0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bd0: 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20  r dbUpdate;     
1be0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
1bf0: 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61  y part of databa
1c00: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20  se file changed 
1c10: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1c20: 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  ar inNormalWrite
1c30: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69  ;   /* True if i
1c40: 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  n a normal write
1c50: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
1c60: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 74 68 61   /* If true, tha
1c70: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
1c80: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61  ealing with a da
1c90: 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
1ca0: 20 68 61 73 0a 20 20 2a 2a 20 61 20 72 61 6e 67   has.  ** a rang
1cb0: 65 20 6f 66 20 6c 6f 63 6b 69 6e 67 20 62 79 74  e of locking byt
1cc0: 65 73 20 66 72 6f 6d 20 50 45 4e 44 49 4e 47 5f  es from PENDING_
1cd0: 42 59 54 45 20 74 68 72 6f 75 67 68 20 50 45 4e  BYTE through PEN
1ce0: 44 49 4e 47 5f 42 59 54 45 2b 35 31 31 0a 20 20  DING_BYTE+511.  
1cf0: 2a 2a 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  ** which should 
1d00: 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1d10: 20 77 72 69 74 74 65 6e 2e 20 20 41 73 73 65 72   written.  Asser
1d20: 74 73 28 29 20 77 69 6c 6c 20 76 65 72 69 66 79  ts() will verify
1d30: 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 73 69 67   this */.  unsig
1d40: 6e 65 64 20 63 68 61 72 20 69 73 4c 6f 63 6b 61  ned char isLocka
1d50: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  ble;      /* Tru
1d60: 65 20 69 66 20 66 69 6c 65 20 6d 69 67 68 74 20  e if file might 
1d70: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 23 65 6e  be locked */.#en
1d80: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1d90: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
1da0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
1db0: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1dc0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
1dd0: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
1de0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
1df0: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
1e00: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
1e10: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
1e20: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
1e30: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
1e40: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
1e50: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
1e60: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
1e70: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
1e80: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
1e90: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
1ea0: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
1eb0: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
1ec0: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
1ed0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
1ee0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
1ef0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
1f00: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1f10: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
1f20: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
1f30: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
1f40: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
1f50: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
1f60: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
1f70: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
1f80: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
1f90: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
1fa0: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
1fb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
1fc0: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
1fd0: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
1fe0: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
1ff0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
2000: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
2010: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
2020: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
2030: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
2040: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
2050: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
2060: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
2070: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
2080: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
2090: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
20a0: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
20b0: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
20c0: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
20d0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
20e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
20f0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
2100: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
2110: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
2120: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2130: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2140: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2150: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2160: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2170: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2180: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2190: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
21a0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  ndif.../*.** Hel
21b0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
21c0: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
21d0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
21e0: 6c 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74  l mutex..*/.stat
21f0: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
2200: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
2210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2220: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
2230: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
2240: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
2250: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
2260: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
2270: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
2280: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
2290: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
22a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
22b0: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
22c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22d0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  DEBUG./*.** Help
22e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
22f0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
2300: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
2310: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
2320: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
2330: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
2340: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
2350: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
2360: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
2370: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
2380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63   const char *loc
2390: 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f  ktypeName(int lo
23a0: 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63  cktype){.  switc
23b0: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
23c0: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
23d0: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
23e0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
23f0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
2400: 22 3b 0a 20 20 63 61 73 65 20 52 45 53 45 52 56  ";.  case RESERV
2410: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
2420: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 63 61  "RESERVED";.  ca
2430: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
2440: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
2450: 22 3b 0a 20 20 63 61 73 65 20 45 58 43 4c 55 53  ";.  case EXCLUS
2460: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
2470: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
2480: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
2490: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
24a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
24b0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
24c0: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
24d0: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
24e0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
24f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2500: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2510: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
2520: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
2530: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
2540: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
2550: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
2560: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
2570: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
2580: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
2590: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
25a0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
25b0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
25c0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
25d0: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
25e0: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
25f0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
2600: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
2610: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
2620: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
2630: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
2640: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2650: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
2660: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
2670: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
2680: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
2690: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
26a0: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
26b0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
26c0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
26d0: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
26e0: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
26f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
2700: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
2710: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2720: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
2730: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
2740: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
2750: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
2760: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
2770: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
2780: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2790: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
27a0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
27b0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
27c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
27d0: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
27e0: 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c  T );.  s = fcntl
27f0: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73  (fd, op, p);.  s
2800: 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e  avedErrno = errn
2810: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  o;.  sqlite3Debu
2820: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25  gPrintf("fcntl %
2830: 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64  d %d %s %s %d %d
2840: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2850: 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f  threadid, fd, zO
2860: 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69  pName, zType, (i
2870: 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28  nt)p->l_start, (
2880: 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20  int)p->l_len,.  
2890: 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64     (int)p->l_pid
28a0: 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28  , s);.  if( s==(
28b0: 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54  -1) && op==F_SET
28c0: 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65  LK && (p->l_type
28d0: 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e  ==F_RDLCK || p->
28e0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29  l_type==F_WRLCK)
28f0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
2900: 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20  lock l2;.    l2 
2910: 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28  = *p;.    fcntl(
2920: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
2930: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
2940: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2950: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
2960: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
2970: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
2980: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
2990: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
29a0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
29b0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
29c0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
29d0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
29e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29f0: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
2a00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
2a10: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
2a20: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
2a30: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
2a40: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
2a50: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
2a60: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
2a70: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
2a80: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
2a90: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
2aa0: 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63   s;.}.#define fc
2ab0: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
2ac0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a  OCK_TRACE */....
2ae0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2af0: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
2b00: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
2b10: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
2b20: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
2b30: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
2b40: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
2b50: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
2b60: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
2b70: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
2b80: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
2b90: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
2ba0: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
2bb0: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
2bc0: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
2bd0: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
2be0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2bf0: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
2c00: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
2c10: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
2c20: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2c30: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
2c40: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
2c50: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
2c60: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
2c70: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
2c80: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
2c90: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
2ca0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2cb0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
2cc0: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
2cd0: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
2ce0: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
2cf0: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20  (posixError) {. 
2d00: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
2d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d20: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 47 41      .  case EAGA
2d30: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
2d40: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
2d50: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
2d60: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
2d70: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
2d80: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
2d90: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
2da0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
2db0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
2dc0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
2dd0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
2de0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
2df0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
2e00: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2e10: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
2e20: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
2e30: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
2e40: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
2e50: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
2e60: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
2e70: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
2e80: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
2e90: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
2ea0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
2eb0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2ec0: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
2ed0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
2ee0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
2ef0: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
2f00: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
2f10: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
2f20: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2f40: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
2f50: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
2f60: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
2f70: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
2f80: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
2f90: 20 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b   .  case EDEADLK
2fa0: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
2fb0: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2fc0: 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  D;.    .#if EOPN
2fd0: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
2fe0: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
2ff0: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
3000: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
3010: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
3020: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
3030: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
3040: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
3050: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
3060: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
3070: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
3080: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
3090: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
30a0: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
30b0: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
30c0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
30d0: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
30e0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
30f0: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
3100: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
3110: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
3120: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
3130: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
3140: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
3150: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
3160: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
3170: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
3180: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
3190: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
31a0: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
31b0: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
31c0: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
31d0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
31e0: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
31f0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
3200: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3210: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
3220: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
3230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3280: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
3290: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
32a0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
32b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
32c0: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
32d0: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
32e0: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
32f0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
3300: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
3310: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
3320: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
3330: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
3340: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
3350: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
3360: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
3370: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
3380: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
3390: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
33a0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
33b0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
33c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
33d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
33e0: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
33f0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
3400: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
3410: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
3420: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
3430: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
3440: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
3450: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
3460: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
3470: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
3480: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
3490: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
34a0: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
34b0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
34c0: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
34d0: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
34e0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
34f0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
3500: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
3510: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
3520: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
3530: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
3540: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
3550: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
3560: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
3570: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
3580: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
3590: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
35a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
35b0: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
35c0: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
35d0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
35e0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
3610: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
3620: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
3630: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
3640: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
3650: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
3660: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
3670: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
3680: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
3690: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
36a0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
36b0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
36c0: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
36d0: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
36e0: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
36f0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
3700: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
3720: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3730: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
3740: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
3750: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
3760: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
3770: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
3780: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
3790: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
37a0: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
37b0: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
37c0: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
37d0: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
37e0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
37f0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
3800: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
3810: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
3820: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
3830: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
3840: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
3850: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
3860: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
3870: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
3880: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
3890: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
38a0: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
38b0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
38c0: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
38d0: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
38e0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
38f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
3900: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
3910: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
3920: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
3930: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
3940: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
3950: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
3960: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3970: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
3980: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
3990: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
39a0: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
39b0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
39c0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
39d0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
39e0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
39f0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
3a00: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
3a10: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
3a20: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
3a30: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
3a40: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3a50: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
3a60: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
3a70: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3a80: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3a90: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
3aa0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
3ab0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
3ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3ad0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3ae0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
3af0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
3b00: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
3b10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
3b20: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
3b30: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
3b40: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
3b50: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
3b60: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
3b70: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
3b80: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
3b90: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
3ba0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
3bb0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
3bc0: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
3bd0: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
3be0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
3bf0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
3c00: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
3c10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
3c20: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3c30: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
3c40: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
3c50: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
3c60: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
3c70: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
3c80: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
3c90: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
3ca0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
3cb0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
3cc0: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
3cd0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
3ce0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3cf0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
3d00: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
3d10: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
3d20: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
3d30: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3d60: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
3d70: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
3d80: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
3d90: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
3da0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
3db0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
3dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
3dd0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
3de0: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
3df0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3e00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3e10: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
3e20: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
3e30: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
3e40: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
3e50: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
3e60: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
3e70: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
3e80: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
3e90: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
3ea0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
3eb0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
3ec0: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
3ed0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
3ee0: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
3ef0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
3f00: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
3f10: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
3f20: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
3f30: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
3f40: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
3f50: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
3f60: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
3f70: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
3f80: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
3f90: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
3fa0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3fb0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
3fc0: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
3fd0: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
3fe0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3ff0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
4000: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
4010: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
4020: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
4030: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
4040: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
4050: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4060: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
4070: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
4080: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
4090: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
40a0: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
40b0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
40c0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
40d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
40e0: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
40f0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
4100: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
4110: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
4120: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
4130: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
4140: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
4150: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4160: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
4170: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4180: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
4190: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
41a0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
41b0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
41c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
41d0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
41e0: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
41f0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
4200: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
4210: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
4220: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
4230: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
4240: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
4250: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
4260: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
4270: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
4280: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
4290: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
42a0: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
42b0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
42c0: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
42d0: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
42e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
42f0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
4300: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
4310: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
4320: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
4330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
4340: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
4350: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
4360: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
4370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
43d0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
43e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
4440: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
4450: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
4460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4470: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
4480: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
4490: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
44a0: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
44b0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
44c0: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
44d0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
44e0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
44f0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
4500: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
4510: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
4520: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
4530: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
4540: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
4550: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
4560: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
4570: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
4580: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
4590: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
45a0: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
45b0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
45c0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
45d0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
45e0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
45f0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
4600: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
4610: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
4620: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
4630: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4640: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
4650: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
4660: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4670: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
4680: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
4690: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
46a0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
46b0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
46c0: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
46d0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
46e0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
46f0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
4700: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4710: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
4720: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
4730: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
4740: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
4750: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
4760: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
4770: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
4780: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
4790: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
47a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
47b0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
47c0: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
47d0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
47e0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
47f0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
4800: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
4810: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
4820: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
4830: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
4840: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4850: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
4860: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
4870: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
4880: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
4890: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
48a0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
48b0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
48c0: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
48d0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
48e0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
48f0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
4900: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
4910: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
4920: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
4930: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
4940: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
4950: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
4960: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
4970: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4980: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
4990: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
49a0: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
49b0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
49c0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
49d0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
49e0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
49f0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
4a00: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
4a10: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
4a20: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
4a30: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
4a40: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
4a50: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
4a60: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
4a70: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
4a80: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
4a90: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
4aa0: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
4ab0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
4ac0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
4ad0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
4ae0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
4af0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
4b00: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
4b10: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
4b20: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
4b30: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
4b40: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
4b50: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
4b60: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
4b70: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
4b80: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
4b90: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
4ba0: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
4bb0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
4bc0: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
4bd0: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
4be0: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
4bf0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
4c00: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
4c10: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
4c20: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
4c30: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
4c40: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
4c50: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
4c60: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
4c70: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
4c80: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
4c90: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
4ca0: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
4cb0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
4cc0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
4cd0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
4ce0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
4cf0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
4d00: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
4d10: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
4d20: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
4d30: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
4d40: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
4d50: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
4d60: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
4d70: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
4d80: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
4d90: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
4da0: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
4db0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
4dc0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
4dd0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
4de0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
4df0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
4e00: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4e10: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
4e20: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
4e30: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
4e40: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
4e50: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
4e60: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
4e70: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
4e80: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
4e90: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
4ea0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
4eb0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
4ec0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
4ed0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
4ee0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
4ef0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
4f00: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
4f10: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
4f20: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
4f30: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
4f40: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
4f50: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
4f60: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
4f70: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
4f80: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
4f90: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
4fa0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
4fb0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
4fc0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
4fd0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
4fe0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
4ff0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
5000: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
5010: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
5020: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
5030: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
5040: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
5050: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
5060: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
5070: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
5080: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
5090: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
50a0: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
50b0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
50c0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
50d0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
50e0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
50f0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
5100: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
5110: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e  pointer to an un
5120: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
5130: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
5140: 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ne unixOpenCnt s
5150: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
5160: 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63  open inode, whic
5170: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c  h means that mul
5180: 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20 63  tiple unixFile c
5190: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  an point to a si
51a0: 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e  ngle.** unixOpen
51b0: 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74  Cnt.  When an at
51c0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
51d0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
51e0: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
51f0: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
5200: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
5210: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
5220: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
5230: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
5240: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
5250: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5260: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
5270: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
5280: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
5290: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
52a0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
52b0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
52c0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
52d0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
52e0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
52f0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
5300: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
5310: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
5320: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
5330: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
5340: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
5350: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
5360: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
5370: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
5380: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
5390: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
53a0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
53b0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
53c0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
53d0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
53e0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
53f0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
5400: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
5410: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
5420: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
5430: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
5440: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
5450: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
5460: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
5470: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
5480: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
5490: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
54a0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
54b0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
54c0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
54d0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
54e0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
54f0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5500: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
5510: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
5520: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
5530: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
5540: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
5550: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
5560: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
5570: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
5580: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5590: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
55a0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
55b0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
55c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
55d0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65   thread B..** We
55e0: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72 75   have to do a ru
55f0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
5600: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
5610: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
5620: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
5630: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d  .**.** On system
5640: 73 20 77 68 65 72 65 20 74 68 72 65 61 64 20 41  s where thread A
5650: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f   is unable to mo
5660: 64 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61 74  dify locks creat
5670: 65 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64 20  ed by.** thread 
5680: 42 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65  B, we have to ke
5690: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69 63  ep track of whic
56a0: 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64  h thread created
56b0: 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20   each.** lock.  
56c0: 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 61  Hence there is a
56d0: 6e 20 65 78 74 72 61 20 66 69 65 6c 64 20 69 6e  n extra field in
56e0: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
56f0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  unixLockInfo.** 
5700: 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 63  structure to rec
5710: 6f 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  ord this informa
5720: 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68  tion.  And on th
5730: 6f 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a 2a  ose systems it.*
5740: 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  * is illegal to 
5750: 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  begin a transact
5760: 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65 61  ion in one threa
5770: 64 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74 0a  d and finish it.
5780: 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20  ** in another.  
5790: 46 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72 20  For this latter 
57a0: 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68 65  restriction, the
57b0: 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72  re is no work-ar
57c0: 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61  ound..** It is a
57d0: 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c   limitation of L
57e0: 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a  inuxThreads..*/.
57f0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68  ./*.** Set or ch
5800: 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65  eck the unixFile
5810: 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69  .tid field.  Thi
5820: 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77  s field is set w
5830: 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a  hen an unixFile.
5840: 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  ** is first open
5850: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
5860: 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20  ent uses of the 
5870: 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20  unixFile verify 
5880: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
5890: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
58a0: 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78  ting on the unix
58b0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
58c0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
58d0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
58e0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
58f0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
5900: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
5910: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
5920: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
5930: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
5940: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
5950: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5960: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
5970: 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65   while locks are
5980: 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72   held..**.** Ver
5990: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
59a0: 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69  -01-15):  unixFi
59b0: 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20  le can be moved 
59c0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20  from one thread 
59d0: 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73  to.** another as
59e0: 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20   long as we are 
59f0: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73  running on a sys
5a00: 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74  tem that support
5a10: 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65  s threads.** ove
5a20: 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68  rriding each oth
5a30: 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68  ers locks (which
5a40: 20 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74   is now the most
5a50: 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72   common behavior
5a60: 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f  ).** or if no lo
5a70: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42  cks are held.  B
5a80: 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  ut the unixFile.
5a90: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
5aa0: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
5ab0: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
5ac0: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
5ad0: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
5ae0: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
5af0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
5b00: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
5b10: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
5b20: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
5b30: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
5b40: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
5b50: 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
5b60: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29   SET_THREADID(X)
5b70: 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74     (X)->tid = pt
5b80: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
5b90: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
5ba0: 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73  ADID(X) (threads
5bb0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5bc0: 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a  rsLocks==0 && \.
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68              !pth
5bf0: 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e  read_equal((X)->
5c00: 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  tid, pthread_sel
5c10: 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  f())).#else.# de
5c20: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
5c30: 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48  D(X).# define CH
5c40: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
5c50: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
5c60: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5c70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5c80: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
5c90: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
5ca0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
5cb0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e  ticular unixOpen
5cc0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69  Cnt structure gi
5cd0: 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20  ven its inode.  
5ce0: 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73  This.** is the s
5cf0: 61 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78 4c  ame as the unixL
5d00: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68  ockKey except th
5d10: 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44  at the thread ID
5d20: 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a   is omitted..*/.
5d30: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
5d40: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d60: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
5d70: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
5d80: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
5d90: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
5da0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
5db0: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
5dc0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
5dd0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
5de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
5df0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
5e00: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
5e10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5e20: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5e30: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
5e40: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
5e50: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
5e60: 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ular unixLockInf
5e70: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
5e80: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
5e90: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
5ea0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
5eb0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5ec0: 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c 20  (LinuxThreads), 
5ed0: 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74  then we.** set t
5ee0: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74  he unixLockKey.t
5ef0: 69 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  id field to the 
5f00: 74 68 72 65 61 64 20 49 44 2e 20 20 49 66 20 74  thread ID.  If t
5f10: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
5f20: 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65  ide.** each othe
5f30: 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20  rs locks (Posix 
5f40: 61 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20 74  and NPTL) then t
5f50: 69 64 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  id is always set
5f60: 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64   to zero..** tid
5f70: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 77   is omitted if w
5f80: 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75  e compile withou
5f90: 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70  t threading supp
5fa0: 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a  ort or on an OS.
5fb0: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69  ** other than li
5fc0: 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  nux..*/.struct u
5fd0: 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73  nixLockKey {.  s
5fe0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
5ff0: 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65   fid;  /* Unique
6000: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
6010: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20  the file */.#if 
6020: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
6030: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
6040: 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61  inux__).  pthrea
6050: 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68 72  d_t tid;  /* Thr
6060: 65 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f  ead ID of lock o
6070: 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f  wner. Zero if no
6080: 74 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68 72  t using LinuxThr
6090: 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  eads */.#endif.}
60a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
60b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
60c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
60d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
60e0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
60f0: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
6100: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
6110: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
6120: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
6130: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
6140: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
6150: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
6160: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
6170: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
6180: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
6190: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
61a0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
61b0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
61c0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
61d0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
61e0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
61f0: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
6200: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
6210: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
6220: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
6230: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b  t unixLockInfo {
6240: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6250: 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20  ckKey lockKey;  
6260: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
6270: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
6280: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
62a0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
62b0: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
62c0: 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  t locktype;     
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62e0: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
62f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
6300: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
6310: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6330: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6340: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6350: 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ture */.  struct
6360: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
6370: 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  Next;     /* Lis
6380: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63  t of all unixLoc
6390: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  kInfo objects */
63a0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
63b0: 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  ckInfo *pPrev;  
63c0: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
63d0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 7d  ubly linked */.}
63e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
63f0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
6400: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
6420: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
6430: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
6440: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
6450: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6460: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
6470: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
6480: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
6490: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
64a0: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
64b0: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
64c0: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
64d0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
64e0: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
64f0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
6500: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
6510: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
6520: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a 0a  ending list..**.
6530: 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69 64  ** TODO:  Consid
6540: 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  er changing this
6550: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
6560: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
6570: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
6580: 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  or for each open
6590: 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65 6e   file, even when
65a0: 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d 75   it is opened mu
65b0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a  ltiple times..**
65c0: 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79 73   The close() sys
65d0: 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20 6f  tem call would o
65e0: 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20 74  nly occur when t
65f0: 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73 65  he last database
6600: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66 69  .** using the fi
6610: 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73 74  le closes..*/.st
6620: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
6630: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
6640: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
6650: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
6660: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
6670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6680: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6690: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
66a0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
66b0: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66d0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
66e0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
66f0: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6710: 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  Number of pendin
6720: 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74  g close() operat
6730: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ions */.  int *a
6740: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
6750: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
6760: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
6770: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
6780: 6f 73 65 28 29 20 2a 2f 0a 23 69 66 20 4f 53 5f  ose() */.#if OS_
6790: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
67a0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
67b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
67c0: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
67d0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
67e0: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
67f0: 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20 4e 61 6d  AME+1];   /* Nam
6800: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
6810: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ore */.#endif.  
6820: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
6830: 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  nt *pNext, *pPre
6840: 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  v;   /* List of 
6850: 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  all unixOpenCnt 
6860: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
6870: 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c  *.** Lists of al
6880: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61  l unixLockInfo a
6890: 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f  nd unixOpenCnt o
68a0: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 75  bjects.  These u
68b0: 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a 2a  sed to be hash.*
68c0: 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 74  * tables.  But t
68d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
68e0: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
68f0: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
6900: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
6910: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
6920: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
6930: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
6940: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73  itical.** path s
6950: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
6960: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
6970: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
6980: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
6990: 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30  fo *lockList = 0
69a0: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
69b0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65  unixOpenCnt *ope
69c0: 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nList = 0;../*.*
69d0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
69e0: 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68 65  remembers whethe
69f0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
6a00: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6a10: 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63  ch others.** loc
6a20: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ks..**.**    0: 
6a30: 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61   No.  Threads ca
6a40: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
6a50: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6a60: 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29    (LinuxThreads)
6a70: 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20  .**    1:  Yes. 
6a80: 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   Threads can ove
6a90: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6aa0: 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78  s locks.  (Posix
6ab0: 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31   & NLPT).**   -1
6ac0: 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77  :  We don't know
6ad0: 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73   yet..**.** On s
6ae0: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20  ome systems, we 
6af0: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
6b00: 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20  time if threads 
6b10: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
6b20: 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b  h.** others lock
6b30: 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73  s.  On those sys
6b40: 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45  tems, the SQLITE
6b50: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
6b60: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77  _LOCK macro.** w
6b70: 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f  ill be set appro
6b80: 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74  priately.  On ot
6b90: 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20  her systems, we 
6ba0: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74  have to check at
6bb0: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e  .** runtime.  On
6bc0: 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79   these latter sy
6bd0: 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48  stems, SQLTIE_TH
6be0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
6bf0: 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e  CK is.** undefin
6c00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
6c10: 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79  ariable normally
6c20: 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20   has file scope 
6c30: 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e  only.  But durin
6c40: 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61  g testing, we ma
6c50: 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61  ke.** it a globa
6c60: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65  l so that the te
6c70: 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e  st code can chan
6c80: 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20  ge its value in 
6c90: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a  order to verify.
6ca0: 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ** that the righ
6cb0: 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20  t stuff happens 
6cc0: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
6cd0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
6ce0: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
6cf0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
6d00: 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f    ifndef SQLITE_
6d10: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6d20: 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e 65  LOCK.#    define
6d30: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6d40: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
6d50: 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65  #  endif.#  ifde
6d60: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
6d70: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
6d80: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
6d90: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
6da0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
6db0: 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 69  #  else.static i
6dc0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
6dd0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6de0: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
6df0: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
6e00: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
6e10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
6e20: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
6e30: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
6e40: 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  into individual 
6e50: 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  test.** threads 
6e60: 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61  by the testThrea
6e70: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
6e80: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
6e90: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
6ea0: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b  Data {.  int fd;
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f  /* File to be lo
6ed0: 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  cked */.  struct
6ee0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
6ef0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
6f00: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
6f10: 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20  nt result;      
6f20: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
6f30: 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  of the locking o
6f40: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  peration */.};..
6f50: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
6f60: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
6f70: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a  (__linux__)./*.*
6f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6f90: 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 6d  is used as the m
6fa0: 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
6fb0: 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68 65  a thread launche
6fc0: 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72 65  d by.** testThre
6fd0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6fe0: 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77 68  r(). It tests wh
6ff0: 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65 64  ether the shared
7000: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a  -lock obtained.*
7010: 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74 68  * by the main th
7020: 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72 65  read in testThre
7030: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7040: 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  r() conflicts wi
7050: 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74  th a.** hypothet
7060: 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ical write-lock 
7070: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
7080: 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20 73   thread on the s
7090: 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ame file..**.** 
70a0: 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  The write-lock i
70b0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
70c0: 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69 73  cquired, as this
70d0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
70e0: 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65   if .** the file
70f0: 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61 64   is open in read
7100: 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65 20  -only mode (see 
7110: 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a  ticket #3472)..*
7120: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  / .static void *
7130: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
7140: 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  t(void *pArg){. 
7150: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
7160: 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  stData *pData = 
7170: 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  (struct threadTe
7180: 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  stData*)pArg;.  
7190: 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20  pData->result = 
71a0: 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c  fcntl(pData->fd,
71b0: 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74 61   F_GETLK, &pData
71c0: 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72  ->lock);.  retur
71d0: 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  n pArg;.}.#endif
71e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41   /* SQLITE_THREA
71f0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
7200: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a  (__linux__) */..
7210: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7220: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7230: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
7240: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
7250: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
7260: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
7270: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
7280: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
7290: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
72a0: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
72b0: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
72c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
72d0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
72e0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
72f0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
7300: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7310: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
7320: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74  .  int fd;.  int
7330: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68   rc;.  struct th
7340: 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a  readTestData d;.
7350: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
7360: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b  ;.  pthread_t t;
7370: 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f  ..  fd = dup(fd_
7380: 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c  orig);.  if( fd<
7390: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
73a0: 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65  mset(&l, 0, size
73b0: 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79  of(l));.  l.l_ty
73c0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
73d0: 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  l.l_len = 1;.  l
73e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
73f0: 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  l.l_whence = SEE
7400: 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63  K_SET;.  rc = fc
7410: 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53  ntl(fd_orig, F_S
7420: 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28  ETLK, &l);.  if(
7430: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b   rc!=0 ) return;
7440: 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c  .  memset(&d, 0,
7450: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
7460: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f  .fd = fd;.  d.lo
7470: 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b  ck = l;.  d.lock
7480: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
7490: 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  K;.  pthread_cre
74a0: 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61  ate(&t, 0, threa
74b0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
74c0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69  );.  pthread_joi
74d0: 6e 28 74 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65  n(t, 0);.  close
74e0: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
74f0: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
7500: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
7510: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7520: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
7530: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7540: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7550: 45 5f 54 48 45 52 41 44 53 41 46 45 20 26 26 20  E_THERADSAFE && 
7560: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7570: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7580: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7590: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
75a0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
75b0: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
75c0: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
75d0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
75e0: 49 6e 66 6f 28 73 74 72 75 63 74 20 75 6e 69 78  Info(struct unix
75f0: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29  LockInfo *pLock)
7600: 7b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b  {.  if( pLock ){
7610: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66  .    pLock->nRef
7620: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  --;.    if( pLoc
7630: 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  k->nRef==0 ){.  
7640: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
7650: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
7660: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70  assert( pLock->p
7670: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f  Prev->pNext==pLo
7680: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ck );.        pL
7690: 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ock->pPrev->pNex
76a0: 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  t = pLock->pNext
76b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
76c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
76d0: 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29  ockList==pLock )
76e0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69  ;.        lockLi
76f0: 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  st = pLock->pNex
7700: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
7710: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78   if( pLock->pNex
7720: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
7730: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ert( pLock->pNex
7740: 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20  t->pPrev==pLock 
7750: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  );.        pLock
7760: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
7770: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20   pLock->pPrev;. 
7780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7790: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29  ite3_free(pLock)
77a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
77b0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
77c0: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
77d0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
77e0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
77f0: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
7800: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7810: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
7820: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
7830: 4f 70 65 6e 29 7b 0a 20 20 69 66 28 20 70 4f 70  Open){.  if( pOp
7840: 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d  en ){.    pOpen-
7850: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7860: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
7870: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
7880: 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  en->pPrev ){.   
7890: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
78a0: 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  en->pPrev->pNext
78b0: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
78c0: 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d     pOpen->pPrev-
78d0: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
78e0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
78f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7900: 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f  rt( openList==pO
7910: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  pen );.        o
7920: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d  penList = pOpen-
7930: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
7940: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
7950: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
7960: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
7970: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
7980: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7990: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50  pOpen->pNext->pP
79a0: 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72  rev = pOpen->pPr
79b0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
79c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
79d0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
79e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
79f0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
7a00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
7a10: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
7a20: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 75  riptor, locate u
7a30: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  nixLockInfo and 
7a40: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7a50: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
7a60: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
7a70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7a80: 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20  Create new ones 
7a90: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
7aa0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
7ab0: 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69  ues might be uni
7ac0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
7ad0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
7ae0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
7af0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
7b00: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
7b10: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
7b20: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
7b30: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
7b40: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
7b50: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
7b60: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
7b70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
7b80: 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  LockInfo **ppLoc
7b90: 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  k,  /* Return th
7ba0: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
7bb0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
7bc0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
7bd0: 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20  enCnt **ppOpen  
7be0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7bf0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7c00: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b  cture here */.){
7c10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
7c40: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
7c50: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
7c80: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
7c90: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
7ca0: 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65  ixLockKey lockKe
7cb0: 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20  y;    /* Lookup 
7cc0: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
7cd0: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
7ce0: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  re */.  struct u
7cf0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
7d00: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
7d10: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
7d20: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20  xOpenCnt struct 
7d30: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
7d40: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
7d50: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
7d60: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
7d70: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  n */.  struct un
7d80: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
7d90: 6b 3b 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  k;    /* Candida
7da0: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
7db0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75  object */.  stru
7dc0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7dd0: 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61  pOpen;     /* Ca
7de0: 6e 64 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e  ndidate unixOpen
7df0: 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  Cnt object */.. 
7e00: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
7e10: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
7e20: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
7e30: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
7e40: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
7e50: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
7e60: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
7e70: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
7e80: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
7e90: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
7ea0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
7eb0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7ec0: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
7ed0: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
7ee0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7ef0: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
7f00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
7f10: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
7f20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7f30: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
7f40: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
7f50: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
7f60: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
7f70: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
7f80: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
7f90: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
7fa0: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
7fb0: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
7fc0: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
7fd0: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
7fe0: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
7ff0: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
8000: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
8010: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
8020: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
8030: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
8040: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
8050: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
8060: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
8070: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
8080: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
8090: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
80a0: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
80b0: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
80c0: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
80d0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
80e0: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
80f0: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
8100: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
8110: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
8120: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
8130: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
8140: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
8150: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
8160: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
8170: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
8180: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
8190: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
81a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
81b0: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
81c0: 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  {.    rc = write
81d0: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20  (fd, "S", 1);.  
81e0: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
81f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8200: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
8210: 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28 66      rc = fstat(f
8220: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
8230: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
8240: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
8250: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
8260: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8270: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
8280: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
8290: 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20 30  mset(&lockKey, 0
82a0: 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79  , sizeof(lockKey
82b0: 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69  ));.  lockKey.fi
82c0: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
82d0: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
82e0: 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65 79  XWORKS.  lockKey
82f0: 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  .fid.pId = pFile
8300: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 6c  ->pId;.#else.  l
8310: 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20 3d  ockKey.fid.ino =
8320: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
8330: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
8340: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
8350: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
8360: 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61 64  __).  if( thread
8370: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
8380: 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20  ersLocks<0 ){.  
8390: 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b    testThreadLock
83a0: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b  ingBehavior(fd);
83b0: 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e 74  .  }.  lockKey.t
83c0: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
83d0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
83e0: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
83f0: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
8400: 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63 6b  .  fileId = lock
8410: 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20 70  Key.fid;.  if( p
8420: 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  pLock!=0 ){.    
8430: 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74  pLock = lockList
8440: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c 6f  ;.    while( pLo
8450: 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c 6f  ck && memcmp(&lo
8460: 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e 6c  ckKey, &pLock->l
8470: 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28 6c  ockKey, sizeof(l
8480: 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20 20  ockKey)) ){.    
8490: 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 2d    pLock = pLock-
84a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
84b0: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
84c0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
84d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
84e0: 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29  sizeof(*pLock) )
84f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
8500: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
8510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8520: 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
8530: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
8540: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
8550: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 20   pLock->lockKey 
8560: 3d 20 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20 20 20  = lockKey;.     
8570: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31   pLock->nRef = 1
8580: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
8590: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  nt = 0;.      pL
85a0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
85b0: 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  0;.      pLock->
85c0: 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74  pNext = lockList
85d0: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  ;.      pLock->p
85e0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
85f0: 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c  if( lockList ) l
8600: 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  ockList->pPrev =
8610: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f   pLock;.      lo
8620: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a  ckList = pLock;.
8630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8640: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a   pLock->nRef++;.
8650: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63      }.    *ppLoc
8660: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  k = pLock;.  }. 
8670: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
8680: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70  {.    pOpen = op
8690: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  enList;.    whil
86a0: 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63  e( pOpen && memc
86b0: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f 70  mp(&fileId, &pOp
86c0: 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  en->fileId, size
86d0: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
86e0: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70       pOpen = pOp
86f0: 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  en->pNext;.    }
8700: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d  .    if( pOpen==
8710: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  0 ){.      pOpen
8720: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
8730: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e  c( sizeof(*pOpen
8740: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
8750: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
8760: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
8770: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
8780: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
8790: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
87a0: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
87b0: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
87c0: 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65 49      pOpen->fileI
87d0: 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20 20  d = fileId;.    
87e0: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20    pOpen->nRef = 
87f0: 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  1;.      pOpen->
8800: 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  nLock = 0;.     
8810: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
8820: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
8830: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->aPending = 0;
8840: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e  .      pOpen->pN
8850: 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a  ext = openList;.
8860: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72        pOpen->pPr
8870: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ev = 0;.      if
8880: 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f 70 65  ( openList ) ope
8890: 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  nList->pPrev = p
88a0: 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70 65 6e  Open;.      open
88b0: 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a 23 69  List = pOpen;.#i
88c0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
88d0: 20 20 20 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d     pOpen->pSem =
88e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4f 70   NULL;.      pOp
88f0: 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  en->aSemName[0] 
8900: 3d 20 27 5c 30 27 3b 0a 23 65 6e 64 69 66 0a 20  = '\0';.#endif. 
8910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8920: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pOpen->nRef++;. 
8930: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e     }.    *ppOpen
8940: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65   = pOpen;.  }..e
8950: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
8960: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
8970: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
8980: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  e currently in a
8990: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
89a0: 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61  d than the threa
89b0: 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e  d that the.** un
89c0: 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20  ixFile argument 
89d0: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e  belongs to, then
89e0: 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73   transfer owners
89f0: 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46  hip of the unixF
8a00: 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74  ile.** over to t
8a10: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
8a20: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46  d..**.** A unixF
8a30: 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65  ile is only owne
8a40: 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e  d by a thread on
8a50: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75 73   systems that us
8a60: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a  e LinuxThreads..
8a70: 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20  **.** Ownership 
8a80: 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79  transfer is only
8a90: 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
8aa0: 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72 72  unixFile is curr
8ab0: 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a  ently unlocked..
8ac0: 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46 69  ** If the unixFi
8ad0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64  le is locked and
8ae0: 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73   an ownership is
8af0: 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74   wrong, then ret
8b00: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  urn.** SQLITE_MI
8b10: 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b  SUSE.  SQLITE_OK
8b20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
8b30: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
8b40: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8b50: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
8b60: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
8b80: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e  sferOwnership(un
8b90: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
8ba0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
8bb0: 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69  ead_t hSelf;.  i
8bc0: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
8bd0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
8be0: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65  s ){.    /* Owne
8bf0: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73 20  rship transfers 
8c00: 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68  not needed on th
8c10: 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  is system */.   
8c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8c30: 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d  K;.  }.  hSelf =
8c40: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
8c50: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 65  .  if( pthread_e
8c60: 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c  qual(pFile->tid,
8c70: 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f   hSelf) ){.    /
8c80: 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69  * We are still i
8c90: 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  n the same threa
8ca0: 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  d */.    OSTRACE
8cb0: 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20  1("No-transfer, 
8cc0: 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b  same thread\n");
8cd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8ce0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
8cf0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8d00: 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
8d10: 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68   /* We cannot ch
8d20: 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77  ange ownership w
8d30: 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64  hile we are hold
8d40: 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20  ing a lock! */. 
8d50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d60: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f  _MISUSE;.  }.  O
8d70: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
8d80: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
8d90: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
8da0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
8db0: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
8dc0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
8dd0: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
8de0: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
8df0: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
8e00: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
8e10: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
8e20: 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  ck);.    rc = fi
8e30: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  ndLockInfo(pFile
8e40: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
8e50: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
8e60: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
8e70: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
8e80: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
8e90: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
8ea0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
8eb0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
8ec0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
8ed0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
8ee0: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
8ef0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
8f00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
8f10: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
8f20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8f30: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e  }.#else  /* if n
8f40: 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ot SQLITE_THREAD
8f50: 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20  SAFE */.  /* On 
8f60: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
8f70: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
8f80: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
8f90: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
8fa0: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
8fb0: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
8fc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8fd0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
8fe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8ff0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
9000: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9010: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9020: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9030: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9040: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9050: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9060: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
9070: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
9080: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
9090: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
90a0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
90b0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
90c0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
90d0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
90e0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
90f0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
9100: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
9110: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
9120: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
9130: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9140: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
9150: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9160: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
9170: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
9180: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
9190: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
91a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
91b0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
91c0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
91d0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
91e0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
91f0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9200: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
9210: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
9220: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
9230: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
9240: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
9250: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9260: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9270: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9280: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
9290: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
92a0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
92b0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
92c0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
92d0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
92e0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
92f0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
9300: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
9310: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
9320: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
9330: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9340: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
9350: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
9360: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
9370: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
9380: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9390: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
93a0: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
93b0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
93c0: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
93d0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
93e0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
93f0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
9400: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
9410: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
9420: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9430: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
9440: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
9450: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
9460: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
9470: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
9480: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
94a0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
94b0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
94c0: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
94d0: 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70  K %d %d %d\n", p
94e0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
94f0: 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73  erved);..  *pRes
9500: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
9510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9520: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
9530: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
9540: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
9550: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
9560: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
9570: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
9580: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
9590: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
95a0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
95b0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
95c0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
95d0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
95e0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
95f0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
9600: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
9610: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
9620: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
9630: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
9640: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
9650: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
9660: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
9670: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
9680: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
9690: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
96a0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
96b0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
96c0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
96d0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
96e0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
96f0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
9700: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
9710: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
9720: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
9730: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
9740: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
9750: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
9760: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
9770: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
9780: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
9790: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
97a0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
97b0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
97c0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
97d0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
97e0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
97f0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
9800: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
9810: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
9820: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
9830: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
9840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9850: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
9860: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
9870: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
9880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
9890: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
98a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
98b0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
98c0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
98d0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
98e0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
98f0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
9900: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
9910: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
9920: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
9930: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
9940: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
9950: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
9960: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
9970: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
9980: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
9990: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
99a0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
99b0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
99c0: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
99d0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
99e0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
99f0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
9a00: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
9a10: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
9a20: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
9a30: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
9a40: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
9a50: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
9a60: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
9a70: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
9a80: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
9a90: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
9aa0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
9ab0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
9ac0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
9ad0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
9ae0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
9af0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
9b00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
9b10: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
9b20: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
9b30: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
9b40: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
9b50: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
9b60: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
9b70: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
9b80: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
9b90: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
9ba0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
9bb0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
9bc0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
9bd0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
9be0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
9bf0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
9c00: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9c10: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
9c20: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
9c30: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
9c40: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9c50: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
9c60: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
9c70: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
9c80: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
9c90: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
9ca0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
9cb0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
9cc0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
9cd0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
9ce0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
9cf0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
9d00: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
9d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
9d20: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9d30: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
9d40: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
9d50: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
9d60: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
9d70: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
9d80: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
9d90: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
9da0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
9db0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
9dc0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
9dd0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
9de0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
9df0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
9e00: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
9e10: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
9e20: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
9e30: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
9e40: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
9e50: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
9e60: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
9e70: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
9e80: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
9e90: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
9ea0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
9eb0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
9ec0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
9ed0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
9ee0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
9ef0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
9f00: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
9f10: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
9f20: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
9f30: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
9f40: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
9f50: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
9f60: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
9f70: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
9f80: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
9f90: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
9fa0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
9fb0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
9fc0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
9fd0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
9fe0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
9ff0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
a000: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
a010: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
a020: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
a030: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
a040: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
a050: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
a060: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
a070: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
a080: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
a090: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
a0a0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
a0b0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
a0c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
a0d0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
a0e0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
a0f0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
a100: 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69  nfo *pLock = pFi
a110: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  le->pLock;.  str
a120: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
a130: 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65    int s;..  asse
a140: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
a150: 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20  STRACE7("LOCK   
a160: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
a170: 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20  ,%d) pid=%d\n", 
a180: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
a190: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
a1a0: 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65  ktype), locktype
a1b0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
a1c0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63  type),.      loc
a1d0: 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d  ktypeName(pLock-
a1e0: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63  >locktype), pLoc
a1f0: 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28  k->cnt , getpid(
a200: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
a210: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
a220: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
a230: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
a240: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
a250: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
a260: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
a270: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
a280: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
a290: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
a2a0: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
a2b0: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
a2c0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
a2d0: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
a2e0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33   ){.    OSTRACE3
a2f0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
a300: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
a310: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
a320: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
a330: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
a340: 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
a350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
a360: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
a370: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
a380: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
a390: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
a3a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
a3b0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
a3c0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
a3e0: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
a3f0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
a400: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
a410: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
a420: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
a430: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
a440: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
a450: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
a460: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
a470: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
a480: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
a490: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
a4a0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
a4b0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
a4c0: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
a4d0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
a4e0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
a4f0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
a500: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a510: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
a520: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
a530: 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
a540: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
a550: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
a560: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
a570: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
a580: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
a590: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
a5a0: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
a5b0: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
a5c0: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
a5d0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
a5e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
a5f0: 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
a600: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
a610: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
a620: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
a630: 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44   locktype>SHARED
a640: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
a650: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
a660: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
a670: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
a680: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
a690: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
a6a0: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
a6b0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
a6c0: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
a6d0: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
a6e0: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
a6f0: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
a700: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
a710: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
a720: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
a730: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a740: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
a750: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
a760: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
a770: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
a780: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
a790: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a7a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a7b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
a7c0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
a7d0: 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  type==0 );.    a
a7e0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
a7f0: 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  t>0 );.    pFile
a800: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
a810: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  RED_LOCK;.    pL
a820: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
a830: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
a840: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
a850: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
a860: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
a870: 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  ;..  lock.l_when
a880: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a  ce = SEEK_SET;..
a890: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
a8a0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
a8b0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
a8c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
a8d0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
a8e0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
a8f0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
a900: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
a910: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
a920: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
a930: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
a940: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
a950: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
a960: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
a970: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
a980: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
a990: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
a9a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
a9b0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
a9c0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
a9d0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
a9e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
a9f0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
aa00: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
aa10: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
aa20: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
aa30: 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  1) ){.      int 
aa40: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
aa50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aa60: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
aa70: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
aa80: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
aa90: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
aaa0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
aab0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aac0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aad0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
aae0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
aaf0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
ab00: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
ab10: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
ab20: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
ab30: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
ab40: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
ab50: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
ab60: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
ab70: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ck..  */.  if( l
ab80: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
ab90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
aba0: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  tErrno = 0;.    
abb0: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
abc0: 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nt==0 );.    ass
abd0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ert( pLock->lock
abe0: 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  type==0 );..    
abf0: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
ac00: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
ac10: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ac20: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ac30: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
ac40: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
ac50: 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70 46  f( (s = fcntl(pF
ac60: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
ac70: 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20 29   &lock))==(-1) )
ac80: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
ac90: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20   errno;.    }.  
aca0: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
acb0: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
acc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
acd0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
ace0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
acf0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
ad00: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ad10: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
ad20: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
ad30: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ad40: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
ad50: 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   s != -1 ){.    
ad60: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
ad70: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
ad80: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
ad90: 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
ada0: 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20  = errno; .      
adb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
adc0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
add0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
ade0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
adf0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
ae00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ae10: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
ae20: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ae30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
ae40: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ae50: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  _lock;.      }. 
ae60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d     }.    if( s==
ae70: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63  (-1) ){.      rc
ae80: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ae90: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
aea0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
aeb0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
aec0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
aed0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
aee0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
aef0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
af00: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
af10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
af20: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
af30: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
af40: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
af50: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
af60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
af70: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
af80: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
af90: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
afa0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
afb0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
afc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
afd0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
afe0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
aff0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
b000: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
b010: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
b020: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b030: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
b040: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
b050: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
b060: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
b070: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
b080: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
b090: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
b0a0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
b0b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
b0c0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
b0d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
b0e0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
b0f0: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
b100: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
b110: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
b120: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
b130: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
b140: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
b150: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b160: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
b170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b180: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
b190: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
b1a0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
b1b0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
b1c0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
b1d0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b1e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
b200: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
b210: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
b220: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b230: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
b240: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
b250: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
b260: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
b280: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
b290: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
b2a0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
b2b0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b2c0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b2d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b2e0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b2f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b300: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
b310: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
b320: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
b330: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
b340: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
b350: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
b360: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
b370: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
b380: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
b390: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
b3a0: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
b3b0: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
b3c0: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
b3d0: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
b3e0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
b3f0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
b400: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
b410: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
b420: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
b430: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  pe<=SHARED_LOCK.
b440: 20 20 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d     && locktype==
b450: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
b460: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
b470: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
b480: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
b490: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
b4a0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
b4b0: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
b4c0: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
b4d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b4e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b4f0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
b500: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
b510: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
b520: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
b530: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b540: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
b550: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
b560: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
b570: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
b580: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
b590: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
b5a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
b5b0: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
b5c0: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
b5d0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
b5e0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
b5f0: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
b600: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
b610: 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74  "failed");.  ret
b620: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b630: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
b640: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
b650: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
b660: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
b670: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
b680: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b690: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
b6a0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
b6b0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
b6c0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
b6d0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
b6e0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
b6f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
b700: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
b710: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
b720: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
b730: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
b740: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
b750: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
b760: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
b770: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73  Info *pLock;.  s
b780: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
b790: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
b7a0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
b7b0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
b7c0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
b7d0: 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   h;..  assert( p
b7e0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
b7f0: 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E7("UNLOCK  %d %
b800: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
b810: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
b820: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
b830: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
b840: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
b850: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  ck->locktype, pF
b860: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c  ile->pLock->cnt,
b870: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61   getpid());..  a
b880: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
b890: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b8a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
b8b0: 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
b8c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b8d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
b8e0: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
b8f0: 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
b900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
b910: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  SUSE;.  }.  unix
b920: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
b930: 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  h = pFile->h;.  
b940: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
b950: 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20  Lock;.  assert( 
b960: 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b  pLock->cnt!=0 );
b970: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
b980: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
b990: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
b9a0: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
b9b0: 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e==pFile->lockty
b9c0: 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  pe );.    Simula
b9d0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
b9e0: 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
b9f0: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
ba00: 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
ba10: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
ba20: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
ba30: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
ba40: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
ba50: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
ba60: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
ba70: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
ba80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ba90: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
baa0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
bab0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
bac0: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
bad0: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
bae0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
baf0: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
bb00: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
bb10: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
bb20: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
bb30: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
bb40: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
bb50: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
bb60: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
bb70: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
bb80: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
bb90: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
bba0: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
bbb0: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
bbc0: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
bbd0: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
bbe0: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
bbf0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
bc00: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
bc10: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
bc20: 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
bc30: 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64   || pFile->dbUpd
bc40: 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ate==0.         
bc50: 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
bc60: 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
bc70: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
bc80: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
bc90: 69 66 0a 0a 0a 20 20 20 20 69 66 28 20 6c 6f 63  if...    if( loc
bca0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
bcb0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
bcc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
bcd0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
bce0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bcf0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
bd00: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
bd10: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
bd20: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
bd30: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
bd40: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
bd50: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
bd60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
bd70: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bd80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bd90: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
bda0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
bdb0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
bdc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
bdd0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
bde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
bdf0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
be00: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
be10: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
be20: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
be30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
be40: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
be50: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
be60: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
be70: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
be80: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
be90: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
bea0: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
beb0: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
bec0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
bed0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
bee0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
bef0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
bf00: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
bf10: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
bf20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bf30: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
bf40: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
bf50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
bf60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
bf70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
bf80: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _UNLOCK);.      
bf90: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
bfa0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
bfb0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bfc0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
bfd0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
bfe0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
bff0: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
c000: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
c010: 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
c020: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20  penCnt *pOpen;. 
c030: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
c040: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 20  ITE_OK;..    /* 
c050: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
c060: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
c070: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
c080: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
c090: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
c0a0: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
c0b0: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
c0c0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
c0d0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
c0e0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
c0f0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a    pLock->cnt--;.
c100: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63      if( pLock->c
c110: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  nt==0 ){.      l
c120: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
c130: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
c140: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
c150: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
c160: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
c170: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
c180: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
c190: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
c1a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
c1b0: 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
c1c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
c1d0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
c1e0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
c1f0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
c200: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
c210: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
c220: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
c230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c240: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
c250: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
c260: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c270: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c280: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c290: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  UNLOCK);.       
c2a0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
c2b0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
c2c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
c2d0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
c2e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c2f0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
c300: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
c310: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
c320: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
c330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c340: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
c350: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
c360: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
c370: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
c380: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
c390: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
c3a0: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
c3b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c3c0: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
c3d0: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
c3e0: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
c3f0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
c400: 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d    */.    pOpen =
c410: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c420: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
c430: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
c440: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
c450: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
c460: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
c470: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
c480: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
c490: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c4a0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b  pOpen->nPending;
c4b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
c4c0: 2a 20 63 6c 6f 73 65 20 70 65 6e 64 69 6e 67 20  * close pending 
c4d0: 66 64 73 2c 20 62 75 74 20 69 66 20 63 6c 6f 73  fds, but if clos
c4e0: 69 6e 67 20 66 61 69 6c 73 20 64 6f 6e 27 74 20  ing fails don't 
c4f0: 66 72 65 65 20 74 68 65 20 61 72 72 61 79 0a 20  free the array. 
c500: 20 20 20 20 20 20 20 2a 2a 20 61 73 73 69 67 6e         ** assign
c510: 20 2d 31 20 74 6f 20 74 68 65 20 73 75 63 63 65   -1 to the succe
c520: 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 64  ssfully closed d
c530: 65 73 63 72 69 70 74 6f 72 73 20 61 6e 64 20 72  escriptors and r
c540: 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20 20 20  ecord the.      
c550: 20 20 2a 2a 20 65 72 72 6f 72 2e 20 20 54 68 65    ** error.  The
c560: 20 6e 65 78 74 20 61 74 74 65 6d 70 74 20 74 6f   next attempt to
c570: 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 74 72 79   unlock will try
c580: 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 20   again. */.     
c590: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50     if( pOpen->aP
c5a0: 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20  ending[i] < 0 ) 
c5b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c5c0: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 4f 70 65    if( close(pOpe
c5d0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 20  n->aPending[i]) 
c5e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
c5f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c600: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
c610: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 49 4f   rc2 = SQLITE_IO
c620: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
c630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c640: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
c650: 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  ing[i] = -1;.   
c660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c670: 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
c680: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c6a0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
c6b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
c6c0: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
c6d0: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
c6e0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
c6f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
c700: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c710: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
c720: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65  2;.    }.  }...e
c730: 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
c740: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
c750: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c760: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
c770: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
c780: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c790: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c7a0: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
c7b0: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
c7c0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
c7d0: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
c7e0: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
c7f0: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
c800: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
c810: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
c820: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
c830: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
c840: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
c850: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
c860: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
c870: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
c880: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
c890: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
c8a0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c8b0: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
c8c0: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
c8d0: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
c8e0: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
c8f0: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
c900: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
c910: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
c920: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
c930: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
c940: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
c950: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
c960: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
c970: 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20    if( pFile ){. 
c980: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69     if( pFile->di
c990: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
c9a0: 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
c9b0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
c9c0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
c9d0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c9e0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
c9f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ca00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
ca10: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
ca20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
ca30: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
ca40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ca50: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
ca60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
ca70: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
ca80: 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  >h);.      if( e
ca90: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  rr ){.        pF
caa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
cab0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
cac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
cad0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
cae0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f   }.    }.#if OS_
caf0: 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20  VXWORKS.    if( 
cb00: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
cb10: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
cb20: 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  sDelete ){.     
cb30: 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d     unlink(pFile-
cb40: 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
cb50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
cb60: 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65       vxworksRele
cb70: 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
cb80: 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69  >pId);.      pFi
cb90: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20  le->pId = 0;.   
cba0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53   }.#endif.    OS
cbb0: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
cbc0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
cbd0: 68 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  h);.    OpenCoun
cbe0: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 6d 65 6d  ter(-1);.    mem
cbf0: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
cc00: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
cc10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
cc20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cc30: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
cc40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
cc50: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
cc60: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
cc70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cc80: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
cc90: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
cca0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
ccb0: 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63  d;.    unixUnloc
ccc0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
ccd0: 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
cce0: 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
ccf0: 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46  ile->pOpen && pF
cd00: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
cd10: 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
cd20: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
cd30: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
cd40: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
cd50: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
cd60: 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
cd70: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
cd80: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
cd90: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
cda0: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
cdb0: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
cdc0: 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  to pOpen->aPendi
cdd0: 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
cde0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
cdf0: 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20  osed when.      
ce00: 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
ce10: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
ce20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
ce30: 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72  *aNew;.      str
ce40: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
ce50: 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e  *pOpen = pFile->
ce60: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65  pOpen;.      aNe
ce70: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
ce80: 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  loc(pOpen->aPend
ce90: 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65  ing, (pOpen->nPe
cea0: 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28  nding+1)*sizeof(
ceb0: 69 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  int) );.      if
cec0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
ced0: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c       /* If a mal
cee0: 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20  loc fails, just 
cef0: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
cf00: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20  scriptor */.    
cf10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf20: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
cf30: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
cf40: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
cf50: 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  [pOpen->nPending
cf60: 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  ] = pFile->h;.  
cf70: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
cf80: 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20  nding++;.       
cf90: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
cfa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cfb0: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
cfc0: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
cfd0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
cfe0: 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  Cnt(pFile->pOpen
cff0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
d000: 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
d010: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
d020: 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
d030: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
d040: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
d050: 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
d060: 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
d070: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
d080: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0d0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
d130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d140: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
d150: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
d160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
d180: 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
d190: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
d1a0: 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
d1b0: 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
d1c0: 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
d1d0: 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
d1e0: 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
d1f0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
d200: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
d210: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
d220: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
d230: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
d240: 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
d250: 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
d260: 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
d270: 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
d280: 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
d290: 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
d2a0: 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
d2b0: 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
d2c0: 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
d2d0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
d2e0: 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
d2f0: 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
d300: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
d310: 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
d320: 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
d330: 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
d340: 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
d350: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
d360: 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
d370: 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
d380: 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
d390: 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
d3a0: 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
d3b0: 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
d3c0: 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
d3d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d3e0: 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
d3f0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
d400: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
d410: 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
d420: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
d430: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
d440: 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
d450: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
d460: 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
d470: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
d480: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
d490: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
d4a0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d4b0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
d4c0: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
d4d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d4e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
d4f0: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
d500: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
d510: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
d520: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
d530: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
d540: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
d550: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
d560: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
d570: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d580: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
d590: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
d5a0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
d5b0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
d5c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d5d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
d5e0: 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
d5f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
d600: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
d610: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
d620: 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
d630: 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
d640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
d650: 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
d660: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
d670: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
d680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
d690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
d6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
d730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d740: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
d750: 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
d760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
d780: 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
d790: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
d7a0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
d7b0: 69 73 74 69 6e 67 20 6f 66 20 73 65 70 61 72 61  isting of separa
d7c0: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
d7d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
d7e0: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
d7f0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
d800: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
d810: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
d820: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
d830: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
d840: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
d850: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
d860: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
d870: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
d880: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
d890: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
d8a0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
d8b0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
d8c0: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
d8d0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
d8e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
d8f0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
d900: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
d910: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
d920: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
d930: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
d940: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
d950: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
d960: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
d970: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
d980: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
d990: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
d9a0: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
d9b0: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
d9c0: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
d9d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
d9e0: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
d9f0: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
da00: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
da10: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
da20: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
da30: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
da40: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
da50: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
da60: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
da70: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
da80: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
da90: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
daa0: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
dab0: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
dac0: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
dad0: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
dae0: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
daf0: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
db00: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
db10: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
db20: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
db30: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
db40: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
db50: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
db60: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
db70: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
db80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
db90: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
dba0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
dbb0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
dbc0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
dbd0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
dbe0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
dbf0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
dc00: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
dc10: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
dc20: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
dc30: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
dc40: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
dc50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
dc60: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
dc70: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
dc80: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
dc90: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
dca0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
dcb0: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
dcc0: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
dcd0: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
dce0: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
dcf0: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
dd00: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
dd10: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
dd20: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
dd30: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
dd40: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
dd50: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
dd60: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
dd70: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
dd80: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
dd90: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
dda0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
ddb0: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
ddc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ddd0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
dde0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
ddf0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
de00: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
de10: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
de20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
de30: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
de40: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
de50: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
de60: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
de70: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
de80: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
de90: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
dea0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
deb0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
dec0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
ded0: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
dee0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  r some other con
def0: 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  nection in the s
df00: 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  ame process.    
df10: 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  ** holds a lock 
df20: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f  on the file.  No
df30: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
df40: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72  urther. */.    r
df50: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
df60: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
df70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66   lock is held if
df80: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
df90: 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73   lockfile exists
dfa0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
dfb0: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
dfc0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
dfd0: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
dfe0: 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  xt;.    reserved
dff0: 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46   = access(zLockF
e000: 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
e010: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
e020: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e030: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
e040: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
e050: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
e060: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
e070: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
e080: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
e090: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
e0a0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
e0b0: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
e0c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
e0d0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
e0e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
e0f0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
e100: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
e110: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
e120: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
e130: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
e140: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
e150: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
e160: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
e170: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
e180: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
e190: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
e1a0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
e1b0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
e1c0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
e1d0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
e1e0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
e1f0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
e200: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
e210: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
e220: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
e230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
e240: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
e250: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
e260: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
e270: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
e280: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
e290: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
e2a0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
e2b0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
e2c0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
e2d0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
e2e0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
e2f0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
e300: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
e310: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
e320: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
e330: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
e340: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
e350: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
e360: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
e370: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
e380: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
e390: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
e3a0: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
e3b0: 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
e3c0: 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
e3d0: 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
e3e0: 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
e3f0: 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
e400: 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
e410: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
e420: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
e430: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e440: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
e450: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e460: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e470: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
e480: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
e490: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
e4a0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
e4b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e4c0: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
e4d0: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
e4e0: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
e4f0: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
e500: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
e510: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
e520: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
e530: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
e540: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
e550: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e560: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
e570: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
e580: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
e590: 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
e5a0: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
e5b0: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
e5c0: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
e5d0: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
e5e0: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
e5f0: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
e600: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e610: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
e620: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
e630: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
e640: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
e650: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
e660: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
e670: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
e680: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
e690: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
e6a0: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
e6b0: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
e6c0: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
e6d0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
e6e0: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
e6f0: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
e700: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e710: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
e720: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
e730: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e740: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e750: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e760: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
e770: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e780: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e790: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e7a0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
e7c0: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
e7d0: 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
e7e0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e7f0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e800: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e810: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
e820: 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
e830: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
e840: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
e850: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e860: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
e870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e880: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e890: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e8a0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e8b0: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
e8c0: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
e8d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e8e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e8f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e900: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e910: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e920: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e930: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e940: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e950: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e960: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e970: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
e980: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e990: 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
e9a0: 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
e9b0: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
e9c0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
e9d0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
e9e0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
e9f0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
ea00: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ea10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
ea20: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
ea30: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
ea40: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
ea50: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ea60: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
ea70: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ea80: 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  d pid=%d\n", pFi
ea90: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
eaa0: 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ..   pFile->lock
eab0: 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
eac0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
ead0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
eae0: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
eaf0: 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
eb00: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
eb10: 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
eb20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
eb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
eb40: 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
eb50: 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
eb60: 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
eb70: 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
eb80: 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
eb90: 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
eba0: 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
ebb0: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
ebc0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
ebd0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
ebe0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
ebf0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
ec00: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
ec10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ec20: 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
ec30: 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
ec40: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
ec50: 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
ec60: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
ec70: 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  =NO_LOCK );.  if
ec80: 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  ( unlink(zLockFi
ec90: 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  le) ){.    int r
eca0: 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
ecb0: 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  o;.    if( ENOEN
ecc0: 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
ecd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ece0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
ecf0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
ed00: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
ed10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ed20: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
ed30: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
ed40: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ed50: 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
ed60: 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
ed70: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ed80: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
ed90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
edb0: 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
edc0: 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
edd0: 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
ede0: 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
edf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
ee00: 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
ee10: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
ee20: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
ee30: 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
ee40: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ee50: 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
ee60: 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
ee70: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
ee80: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
ee90: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
eea0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
eeb0: 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
eec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eee0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
eef0: 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
ef00: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
efe0: 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f010: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
f020: 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
f030: 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
f040: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
f050: 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
f060: 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
f070: 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
f080: 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
f090: 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
f0a0: 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
f0b0: 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
f0c0: 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
f0d0: 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
f0e0: 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
f0f0: 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
f100: 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
f110: 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
f120: 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
f130: 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
f140: 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
f150: 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
f160: 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
f170: 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
f180: 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
f190: 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
f1a0: 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
f1b0: 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
f1c0: 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
f1d0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
f1e0: 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
f1f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f200: 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
f210: 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
f220: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
f230: 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
f240: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
f250: 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
f260: 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
f270: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
f280: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
f290: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
f2a0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
f2b0: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
f2c0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
f2d0: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
f2e0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
f2f0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
f300: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
f310: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
f320: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
f330: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
f340: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
f350: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
f360: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
f370: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
f380: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
f390: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
f3a0: 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
f3b0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
f3c0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f3d0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
f3e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f3f0: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
f400: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
f410: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f420: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
f430: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
f440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f450: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
f460: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
f470: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
f480: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
f490: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
f4a0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
f4b0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
f4c0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
f4d0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
f4e0: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
f4f0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
f500: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
f510: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
f520: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
f530: 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
f540: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
f550: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
f560: 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
f570: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
f580: 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
f590: 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
f5a0: 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
f5b0: 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
f5c0: 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
f5d0: 20 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70     lrc = flock(p
f5e0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
f5f0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72  );.      if ( lr
f600: 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  c ) {.        in
f610: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
f620: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c  ;.        /* unl
f630: 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20  ock failed with 
f640: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
f650: 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
f660: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f670: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f680: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
f690: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
f6a0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
f6b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
f6c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f6d0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f6e0: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
f6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f700: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
f710: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
f720: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
f730: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
f740: 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
f750: 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
f760: 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
f770: 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
f780: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
f790: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
f7a0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
f7b0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f7c0: 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
f7d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f7e0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
f7f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
f800: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
f810: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
f820: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
f830: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
f840: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
f850: 64 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  d);..#ifdef SQLI
f860: 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
f870: 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
f880: 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
f890: 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
f8a0: 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
f8b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f8c0: 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
f8d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f8e0: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
f8f0: 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
f900: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
f910: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
f920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
f930: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
f940: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
f950: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
f960: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
f970: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
f980: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
f990: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
f9a0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
f9b0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
f9c0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
f9d0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
f9e0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
f9f0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
fa00: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
fa10: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
fa20: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
fa30: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
fa40: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
fa50: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
fa60: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
fa70: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
fa80: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
fa90: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
faa0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
fab0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
fac0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
fad0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
fae0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
faf0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
fb00: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
fb10: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
fb20: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
fb30: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
fb40: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
fb50: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
fb60: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
fb70: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
fb80: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
fb90: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
fba0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
fbb0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
fbc0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
fbd0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f  LUSIVE.**.** flo
fbe0: 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ck() only really
fbf0: 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
fc00: 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
fc10: 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
fc20: 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
fc30: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
fc40: 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
fc50: 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
fc60: 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
fc70: 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
fc80: 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
fc90: 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
fca0: 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
fcb0: 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
fcc0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
fcd0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
fce0: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
fcf0: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
fd00: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
fd10: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
fd20: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
fd30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fd40: 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
fd50: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fd60: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e  locktype) {.  in
fd70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fd80: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fd90: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fda0: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
fdb0: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
fdc0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
fdd0: 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
fde0: 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
fdf0: 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
fe00: 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
fe10: 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
fe20: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
fe30: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
fe40: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
fe50: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
fe60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fe70: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
fe80: 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
fe90: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
fea0: 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69  .  if (flock(pFi
feb0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
fec0: 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
fed0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
fee0: 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
fef0: 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
ff00: 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
ff10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
ff20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
ff30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
ff40: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
ff50: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
ff60: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
ff70: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ff80: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  rno;.    }.  } e
ff90: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
ffa0: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
ffb0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
ffc0: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
ffd0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
ffe0: 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  e;.  }.  OSTRACE
fff0: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
10000 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
10010 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
10020 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
10030 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
10040 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
10050 69 6c 65 64 22 29 3b 0a 23 69 66 64 65 66 20 53  iled");.#ifdef S
10060 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
10070 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
10080 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
10090 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
100a0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
100b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
100c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
100d0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
100e0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
100f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
10100 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
10110 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10120 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
10130 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
10140 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
10150 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
10160 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
10170 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
10180 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
10190 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
101a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
101b0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
101c0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
101d0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
101e0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
101f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
10200 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
10210 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
10220 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
10230 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
10240 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10250 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
10260 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10270 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
10280 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
10290 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
102a0 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
102b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  e,.           pF
102c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
102d0 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65  etpid());.  asse
102e0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
102f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
10300 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
10310 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
10320 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
10330 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
10340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10350 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
10360 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
10370 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
10380 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
10390 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
103a0 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f (locktype==SHA
103b0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
103c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
103d0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
103e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
103f0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
10400 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
10410 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
10420 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
10430 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28  LOCK_UN);.  if (
10440 72 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c  rc) {.    int r,
10450 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10460 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45  .    r = sqliteE
10470 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10480 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10490 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
104a0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
104b0 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20  _ERROR(r) ){.   
104c0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
104d0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
104e0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
104f0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
10500 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69  OCK_ERRORS.    i
10510 66 28 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49  f( (r & SQLITE_I
10520 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
10530 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72  IOERR ){.      r
10540 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
10550 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
10560 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
10570 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
10580 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75  */.    .    retu
10590 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn r;.  } else {
105a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
105b0 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
105c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
105d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
105e0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
105f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
10600 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10610 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10620 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
10630 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
10640 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65  _LOCK);.  }.  re
10650 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
10660 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
10670 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10680 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10690 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
106a0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
106b0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
106c0 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
106d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10740 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10790 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
107a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
107b0 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
107c0 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
107f0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
10800 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
10810 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
10820 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
10830 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
10840 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
10850 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
10860 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
10870 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
10880 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
10890 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
108a0 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
108b0 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
108c0 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
108d0 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
108e0 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
108f0 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
10900 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
10910 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
10920 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
10930 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
10940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10950 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
10960 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
10970 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
10980 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
10990 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
109a0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
109b0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
109c0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
109d0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
109e0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
109f0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
10a00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
10a10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
10a20 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
10a30 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
10a40 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
10a50 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
10a60 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
10a70 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
10a80 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10a90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
10aa0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
10ab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10ac0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
10ad0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
10ae0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10af0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
10b00 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
10b10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10b20 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
10b30 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
10b40 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
10b50 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
10b60 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
10b70 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
10b80 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
10b90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
10ba0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10bb0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
10bc0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
10bd0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
10be0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
10bf0 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
10c00 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
10c10 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
10c20 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
10c30 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63  >pSem;.    struc
10c40 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
10c50 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
10c60 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
10c70 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
10c80 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10c90 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
10ca0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10cc0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10cd0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10ce0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
10cf0 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
10d00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10d10 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
10d20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
10d30 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
10d40 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
10d50 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
10d60 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
10d70 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
10d80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c  File->locktype <
10d90 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
10da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10db0 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
10dc0 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
10dd0 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
10de0 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
10df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
10e00 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52  STRACE4("TEST WR
10e10 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e  -LOCK %d %d %d\n
10e20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10e30 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a   reserved);..  *
10e40 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10e50 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
10e70 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
10e80 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
10e90 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
10ea0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
10eb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
10ec0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
10ed0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
10ee0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
10ef0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
10f00 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
10f10 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
10f20 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
10f30 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
10f40 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
10f50 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
10f60 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
10f70 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
10f80 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
10f90 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
10fa0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
10fb0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
10fc0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
10fd0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
10fe0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
10ff0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
11000 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
11010 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
11020 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
11030 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
11040 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11050 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
11060 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
11070 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
11080 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
11090 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
110a0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
110b0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
110c0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
110d0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
110e0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
110f0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
11100 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
11110 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
11120 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
11130 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
11140 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
11150 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
11160 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
11170 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
11180 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
11190 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
111a0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
111b0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
111c0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
111d0 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
111e0 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
111f0 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
11200 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
11210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
11220 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
11230 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
11240 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
11250 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
11260 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
11270 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
11280 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
11290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
112a0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
112b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
112c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
112d0 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
112e0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
112f0 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  ile->pOpen->pSem
11300 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
11310 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
11320 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
11330 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
11340 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
11350 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
11360 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
11370 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
11380 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
11390 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
113a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
113b0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
113c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
113d0 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
113e0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
113f0 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
11400 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
11410 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
11420 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
11430 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
11440 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
11450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
11460 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
11470 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
11480 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
11490 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
114a0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
114b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
114c0 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20 73 65 6d 5f  locktype;.. sem_
114d0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
114e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
114f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
11500 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
11510 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
11520 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
11530 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
11540 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11550 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11560 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11570 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11580 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11590 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
115a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
115b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
115c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
115d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
115e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
115f0 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
11600 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11610 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
11620 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11630 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11640 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
11650 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
11660 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
11670 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
11680 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
11690 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
116a0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
116b0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
116c0 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
116d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
116e0 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
116f0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
11700 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11710 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
11720 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
11730 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11740 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
11750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11760 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11770 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
11780 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
11790 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
117a0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
117b0 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if (locktype==SH
117c0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
117d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
117e0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
117f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11800 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
11810 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
11820 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
11830 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
11840 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
11850 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11860 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11870 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11880 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11890 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
118a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
118b0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
118c0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
118d0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
118e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
118f0 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
11900 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
11910 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
11920 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
11930 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
11940 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
11950 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  semClose(sqlite3
11960 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
11970 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
11980 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11990 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
119a0 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20    semUnlock(id, 
119b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
119c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
119d0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
119e0 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
119f0 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
11a00 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65  pLock);.    rele
11a10 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65  aseOpenCnt(pFile
11a20 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e  ->pOpen);.    un
11a30 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11a40 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
11a50 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
11a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11a70 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
11a80 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
11a90 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
11aa0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
11ab0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
11ac0 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
11ad0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
11ae0 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
11af0 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
11b00 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11b10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b60 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
11be0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
11c10 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
11c20 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
11c30 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
11c40 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
11c50 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
11c60 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
11c70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
11c80 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
11c90 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
11ca0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
11cb0 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
11cc0 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
11cd0 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
11ce0 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
11cf0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
11d00 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
11d10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11d20 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
11d30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
11d40 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
11d50 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
11d60 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
11d70 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
11d80 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
11d90 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
11da0 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
11db0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11dc0 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f   {.  unsigned lo
11dd0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
11de0 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
11df0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
11e00 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11e10 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
11e20 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
11e30 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
11e40 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
11e50 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
11e60 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
11e70 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
11e80 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
11e90 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
11ea0 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
11eb0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
11ec0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
11ed0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
11ee0 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
11ef0 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
11f00 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
11f10 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
11f20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
11f30 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
11f40 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
11f50 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
11f60 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
11f70 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
11f80 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
11f90 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
11fa0 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
11fd0 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
11fe0 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
11ff0 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
12000 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
12010 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
12020 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
12030 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
12040 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
12050 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
12060 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
12070 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
12080 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
12090 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
120a0 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
120b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
120c0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
120d0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
120e0 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
120f0 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
12100 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
12110 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
12120 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
12130 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
12140 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
12150 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
12160 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
12170 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
12180 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
12190 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
121a0 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
121b0 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
121c0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
121d0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
121e0 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
121f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
12200 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
12210 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
12220 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12230 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
12240 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
12250 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
12260 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
12270 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
12280 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
12290 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
122a0 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
122b0 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
122c0 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
122d0 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
122e0 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
122f0 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
12300 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 36  h;.  .  OSTRACE6
12310 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
12320 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
12330 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
12340 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
12350 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
12360 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
12370 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
12380 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
12390 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20  set, length);.  
123a0 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
123b0 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
123c0 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
123d0 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
123e0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
123f0 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
12400 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12410 4f 53 54 52 41 43 45 34 28 22 41 46 50 53 45 54  OSTRACE4("AFPSET
12420 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
12430 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
12440 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
12450 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
12460 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
12470 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
12480 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
12490 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
124a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
124b0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
124c0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
124d0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
12500 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
12510 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
12520 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
12530 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
12540 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
12550 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
12560 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
12570 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
12580 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
12590 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
125a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
125b0 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
125c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
125d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
125e0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
125f0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12600 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12610 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12620 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
12630 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
12640 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
12650 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
12660 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
12670 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
12680 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12690 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
126a0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
126b0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
126c0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
126d0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
126e0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
126f0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
12700 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
12710 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
12720 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12730 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
12740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12750 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12760 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12770 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12780 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12790 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
127a0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
127b0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
127c0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
127d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
127e0 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67   );.  afpLocking
127f0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
12800 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
12810 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
12820 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
12830 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
12840 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12850 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12860 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12870 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
12880 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
12890 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
128a0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
128b0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
128c0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
128d0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
128e0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
128f0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
12900 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
12910 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
12920 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
12930 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12940 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
12950 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
12960 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
12970 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
12980 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
12990 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
129a0 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
129b0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
129c0 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
129d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
129e0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
129f0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
12a00 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
12a10 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
12a20 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
12a30 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
12a40 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
12a50 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
12a60 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
12a70 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
12a80 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12a90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
12aa0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12ab0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
12ac0 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
12ad0 20 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54    .  OSTRACE4("T
12ae0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12af0 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
12b00 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
12b10 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
12b20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12b30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12b40 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
12b50 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
12b60 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
12b70 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
12b80 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
12b90 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
12ba0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
12bb0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
12bc0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
12bd0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
12be0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
12bf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
12c00 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
12c10 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
12c20 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
12c30 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
12c40 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
12c50 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
12c60 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
12c70 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
12c80 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
12c90 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
12ca0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
12cb0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
12cc0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
12cd0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
12ce0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
12cf0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
12d00 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
12d10 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
12d20 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
12d30 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
12d40 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
12d50 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
12d60 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
12d70 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
12d80 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12d90 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12da0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
12db0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
12dc0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
12dd0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
12de0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12df0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12e00 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
12e10 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
12e20 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
12e30 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
12e40 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
12e50 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
12e60 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
12e70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12e80 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
12e90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12ea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
12eb0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12ec0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
12ed0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12ee0 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
12ef0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
12f00 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
12f10 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
12f20 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12f30 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
12f40 20 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70    %d %s was %s p
12f50 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
12f60 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63  >h,.         loc
12f70 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
12f80 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
12f90 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
12fa0 65 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  e), getpid());..
12fb0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
12fc0 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
12fd0 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
12fe0 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
12ff0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
13000 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
13010 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
13020 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
13030 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
13040 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
13050 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
13060 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
13070 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
13080 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
13090 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
130a0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
130b0 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
130c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
130d0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
130e0 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
130f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13110 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
13120 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
13130 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
13140 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
13150 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
13160 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
13170 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
13180 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
13190 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
131a0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
131b0 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
131c0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
131d0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
131e0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
131f0 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
13200 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
13210 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
13220 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
13230 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
13240 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
13250 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
13260 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
13270 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
13280 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
13290 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
132a0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
132b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
132c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
132d0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
132e0 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  c;.  }.    .  /*
132f0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
13300 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
13310 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
13320 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
13330 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
13340 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
13350 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
13360 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
13370 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
13380 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
13390 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
133a0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
133b0 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
133c0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
133d0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
133e0 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
133f0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
13400 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
13410 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
13420 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13430 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
13440 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
13450 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
13460 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
13470 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
13480 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
13490 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
134a0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
134b0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
134c0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
134d0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
134e0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
134f0 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
13500 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
13510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
13520 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13530 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  CK ){.    int lk
13540 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  , lrc1, lrc2, lr
13550 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20 20  c1Errno;.    .  
13560 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
13570 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
13580 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
13590 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
135a0 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
135b0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
135c0 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
135d0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
135e0 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e  ndom(); .    con
135f0 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
13600 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66   = (lk & 0x7ffff
13610 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
13620 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
13630 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13640 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13650 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
13660 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f   SHARED_FIRST+co
13670 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74  ntext->sharedByt
13680 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
13690 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
136a0 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
136b0 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
136c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
136d0 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
136e0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
136f0 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
13700 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
13710 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13720 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
13730 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
13740 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
13750 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
13760 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
13770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
13780 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
13790 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
137a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
137b0 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
137c0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
137d0 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
137e0 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
137f0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
13800 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
13810 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
13820 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
13830 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
13840 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
13850 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
13860 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
13870 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
13880 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Lock++;.    }.  
13890 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
138a0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
138b0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
138c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
138d0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
138e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
138f0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
13900 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
13910 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
13920 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
13930 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
13940 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
13950 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  0!=pFile->lockty
13960 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f  pe );.    if (lo
13970 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56  cktype >= RESERV
13980 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
13990 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53  ->locktype < RES
139a0 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
139b0 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
139c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
139d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
139e0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
139f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13a00 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
13a10 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
13a20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
13a30 65 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d  ed && locktype =
13a40 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
13a50 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
13a60 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
13a70 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
13a80 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
13a90 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
13aa0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
13ab0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
13ac0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
13ad0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
13ae0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
13af0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
13b00 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
13b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13b20 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
13b30 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13b40 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13b50 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74           context
13b80 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
13b90 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
13ba0 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
13bb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
13bc0 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
13bd0 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
13be0 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
13bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
13c00 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
13c10 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13c20 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
13c30 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
13c60 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
13c70 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
13c80 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
13c90 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13ca0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
13cd0 2b 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65  + context->share
13ce0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
13cf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
13d00 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
13d10 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
13d20 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
13d30 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
13d40 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
13d50 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
13d60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13d70 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
13d80 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
13d90 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
13da0 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
13db0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13dc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13dd0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
13de0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
13df0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
13e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e10 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
13e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13e30 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
13e40 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
13e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
13e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13e70 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
13e80 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
13e90 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66  type;.  }else if
13ea0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
13eb0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
13ec0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
13ed0 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
13ee0 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
13ef0 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
13f00 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
13f10 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
13f20 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
13f30 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
13f40 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
13f50 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
13f60 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
13f70 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
13f80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13f90 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13fa0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13fb0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13fc0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
13fd0 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
13fe0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13ff0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
14000 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
14010 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
14020 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
14030 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
14040 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
14050 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
14060 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
14070 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14080 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
14090 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
140a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
140b0 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
140c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
140d0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
140e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
140f0 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
14100 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
14110 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
14120 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
14130 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14140 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14150 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
14160 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14170 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %d pid=%d\n", 
14180 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
14190 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69  pe,.         pFi
141a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
141b0 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
141c0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
141d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
141e0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
141f0 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
14200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14210 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
14220 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
14230 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
14240 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
14250 45 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  E;.  }.  unixEnt
14260 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
14270 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14280 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14290 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
142a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  le->locktype==EX
142b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
142c0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
142d0 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
142e0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
142f0 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
14300 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
14310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14320 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
14330 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
14340 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
14350 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
14360 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
14370 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
14380 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
14390 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
143a0 49 52 53 54 2b 70 43 74 78 2d 3e 73 68 61 72 65  IRST+pCtx->share
143b0 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
143c0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70  c = afpSetLock(p
143d0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  Ctx->dbPath, pFi
143e0 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
143f0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
14400 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14420 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
14430 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
14440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
14450 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64  pSetLock(pCtx->d
14460 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
14470 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
14480 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
14490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
144a0 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
144b0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
144c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
144d0 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d  afpSetLock(pCtx-
144e0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
144f0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
14500 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
14510 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
14520 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
14530 20 2f 2a 20 63 6c 65 61 72 20 74 68 65 20 73 68   /* clear the sh
14540 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ared lock */.   
14550 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
14560 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
14570 53 54 2b 70 43 74 78 2d 3e 73 68 61 72 65 64 42  ST+pCtx->sharedB
14580 79 74 65 3b 0a 20 20 20 20 72 63 20 3d 20 61 66  yte;.    rc = af
14590 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64  pSetLock(pCtx->d
145a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
145b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
145c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
145d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
145e0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
145f0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
14600 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
14610 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
14620 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
14630 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
14640 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
14650 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d  ( pOpen->nLock>=
14660 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
14670 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26  Open->nLock==0 &
14680 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  & pOpen->nPendin
14690 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g>0 ){.        i
146a0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
146b0 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
146c0 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
146d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
146e0 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
146f0 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b   < 0 ) continue;
14700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
14710 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  lose(pOpen->aPen
14720 64 69 6e 67 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ding[i]) ){.    
14730 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
14740 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
14760 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
14770 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20  CLOSE;.         
14780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14790 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
147a0 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  ing[i] = -1;.   
147b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
147c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
147d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
147e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
147f0 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50  3_free(pOpen->aP
14800 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  ending);.       
14810 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
14820 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ng = 0;.        
14830 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
14840 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
14850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14860 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
14870 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
14880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
14890 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
148a0 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
148b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
148c0 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c  lose a file & cl
148d0 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66  eanup AFP specif
148e0 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  ic locking conte
148f0 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xt .*/.static in
14900 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74  t afpClose(sqlit
14910 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
14920 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
14930 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14940 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14950 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
14960 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
14970 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14980 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
14990 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
149a0 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
149b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
149c0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
149d0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
149e0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
149f0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
14a00 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
14a10 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
14a20 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
14a30 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
14a40 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
14a50 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
14a60 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
14a70 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
14a80 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
14a90 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
14aa0 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
14ab0 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
14ac0 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  /.      int *aNe
14ad0 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  w;.      struct 
14ae0 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
14af0 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  en = pFile->pOpe
14b00 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20  n;.      aNew = 
14b10 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
14b20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c  pOpen->aPending,
14b30 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e   (pOpen->nPendin
14b40 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29  g+1)*sizeof(int)
14b50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e   );.      if( aN
14b60 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
14b70 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20   /* If a malloc 
14b80 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b  fails, just leak
14b90 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
14ba0 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ptor */.      }e
14bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
14bc0 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61  en->aPending = a
14bd0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  New;.        pOp
14be0 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
14bf0 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
14c00 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
14c10 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
14c20 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  g++;.        pFi
14c30 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
14c40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
14c50 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
14c60 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
14c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
14c80 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
14c90 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  xt);.    closeUn
14ca0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
14cb0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
14cc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
14ce0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
14cf0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
14d00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
14d10 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
14d20 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
14d30 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
14d40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
14d50 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
14d60 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
14d70 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
14d80 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
14d90 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
14da0 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
14db0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
14dc0 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
14dd0 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
14de0 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
14df0 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
14e00 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
14e10 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14e20 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
14e30 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
14e40 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14eb0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
14ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14f10 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
14f20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
14f30 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
14f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f50 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
14f60 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
14f70 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
14f80 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
14f90 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
14fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
14fb0 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
14fc0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
14fd0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
14fe0 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
14ff0 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
15000 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
15010 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
15020 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
15030 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
15040 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
15050 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
15060 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
15070 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
15080 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
15090 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
150a0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
150b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
150c0 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
150d0 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
150e0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
150f0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15100 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
15110 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
15120 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
15130 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
15140 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
15150 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
15160 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
15170 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
15180 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
15190 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
151a0 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
151b0 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
151c0 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
151d0 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
151e0 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
151f0 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
15200 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
15210 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
15220 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
15230 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
15240 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
15250 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
15260 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
15270 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
15280 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
15290 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
152a0 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
152b0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
152c0 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
152d0 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
152e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
152f0 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
15300 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
15310 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
15320 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
15330 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
15340 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
15350 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e  got = pread(id->
15360 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
15370 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
15380 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
15390 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
153a0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
153b0 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34  .  got = pread64
153c0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
153d0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
153e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
153f0 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
15400 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
15410 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
15420 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
15430 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15440 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
15450 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
15460 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
15470 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
15480 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
15490 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
154a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
154b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
154c0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
154d0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
154e0 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
154f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15500 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68  got = read(id->h
15510 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
15520 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
15530 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
15540 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
15550 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
15560 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f  = errno;.  }.  O
15570 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20  STRACE5("READ   
15580 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
15590 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
155a0 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
155b0 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
155c0 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
155d0 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
155e0 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
155f0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
15600 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
15610 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
15620 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
15630 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
15640 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
15650 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
15660 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
15670 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
15680 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
15690 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
156a0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
156b0 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
156c0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
156d0 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
156e0 4e 65 76 65 72 20 72 65 61 64 20 6f 72 20 77 72  Never read or wr
156f0 69 74 65 20 61 6e 79 20 6f 66 20 74 68 65 20 62  ite any of the b
15700 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
15710 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  ing range */.  a
15720 73 73 65 72 74 28 20 28 28 75 6e 69 78 46 69 6c  ssert( ((unixFil
15730 65 2a 29 69 64 29 2d 3e 69 73 4c 6f 63 6b 61 62  e*)id)->isLockab
15740 6c 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  le==0.          
15750 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
15760 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
15770 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
15780 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
15790 45 20 29 3b 0a 0a 20 20 67 6f 74 20 3d 20 73 65  E );..  got = se
157a0 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
157b0 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c  ile*)id, offset,
157c0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
157d0 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
157e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
157f0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
15800 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a   got<0 ){.    /*
15810 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
15820 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
15830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15840 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
15850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e   }else{.    ((un
15860 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
15870 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
15880 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
15890 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65  r */.    /* Unre
158a0 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
158b0 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
158c0 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
158d0 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
158e0 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
158f0 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
15900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15910 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
15920 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b   }.}../*.** Seek
15930 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
15940 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
15950 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
15960 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
15970 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15980 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
15990 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
159a0 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
159b0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
159c0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
159d0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
159e0 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
159f0 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
15a00 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
15a10 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
15a20 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
15a30 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
15a40 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
15a50 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
15a60 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
15a70 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
15a80 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
15a90 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
15aa0 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
15ab0 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20  = pwrite(id->h, 
15ac0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
15ad0 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  t);.#elif define
15ae0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
15af0 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28   got = pwrite64(
15b00 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15b10 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65  , offset);.#else
15b20 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
15b30 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
15b40 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
15b50 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
15b60 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
15b70 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
15b80 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
15b90 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15ba0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15bc0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15bd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
15be0 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
15bf0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f  urn -1;.  }.  go
15c00 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c  t = write(id->h,
15c10 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
15c20 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
15c30 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
15c40 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
15c50 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15c60 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
15c70 53 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20  STRACE5("WRITE  
15c80 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
15c90 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
15ca0 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
15cb0 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
15cc0 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
15cd0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
15ce0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
15cf0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
15d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15d10 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
15d20 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
15d30 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
15d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
15d50 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
15d60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
15d70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
15d80 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
15d90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
15da0 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77  fset .){.  int w
15db0 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
15dc0 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
15dd0 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
15de0 2f 2a 20 4e 65 76 65 72 20 72 65 61 64 20 6f 72  /* Never read or
15df0 20 77 72 69 74 65 20 61 6e 79 20 6f 66 20 74 68   write any of th
15e00 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
15e10 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
15e20 20 20 61 73 73 65 72 74 28 20 28 28 75 6e 69 78    assert( ((unix
15e30 46 69 6c 65 2a 29 69 64 29 2d 3e 69 73 4c 6f 63  File*)id)->isLoc
15e40 6b 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 20  kable==0.       
15e50 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
15e60 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
15e70 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73           || offs
15e80 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
15e90 42 59 54 45 20 29 3b 0a 0a 23 69 66 6e 64 65 66  BYTE );..#ifndef
15ea0 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
15eb0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
15ec0 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
15ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
15ee0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
15ef0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
15f00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
15f10 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
15f20 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
15f30 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
15f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
15f50 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
15f60 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
15f70 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
15f80 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
15f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
15fa0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
15fb0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
15fc0 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
15fd0 2f 0a 20 20 69 66 28 20 28 28 75 6e 69 78 46 69  /.  if( ((unixFi
15fe0 6c 65 2a 29 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61  le*)id)->inNorma
15ff0 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 75 6e  lWrite ){.    un
16000 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16010 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
16020 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
16030 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
16040 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
16050 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
16060 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
16070 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
16080 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
16090 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
160a0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
160b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
160c0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
160d0 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
160e0 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
160f0 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
16100 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16110 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
16120 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
16130 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
16140 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
16150 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
16160 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
16170 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
16180 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
16190 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
161a0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
161b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
161c0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
161d0 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
161e0 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
161f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f  (unixFile*)id, o
16200 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
16210 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
16220 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
16230 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
16240 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
16250 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
16260 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
16270 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
16280 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
16290 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
162a0 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
162b0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
162c0 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
162d0 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
162e0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
162f0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
16300 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
16310 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16320 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
16330 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  se{.      ((unix
16340 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
16350 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74  rrno = 0; /* not
16360 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
16370 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
16380 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
16390 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
163a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
163b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
163c0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
163d0 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
163e0 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
163f0 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
16400 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
16410 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
16420 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
16430 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
16440 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
16450 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
16460 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
16470 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
16480 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
16490 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
164a0 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
164b0 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
164c0 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
164d0 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
164e0 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
164f0 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
16500 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
16510 20 28 73 6c 6f 77 65 72 29 20 66 73 79 6e 63 28   (slower) fsync(
16520 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f  )..** If you kno
16530 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74  w that your syst
16540 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  em does support 
16550 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72  fdatasync() corr
16560 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73  ectly,.** then s
16570 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69  imply compile wi
16580 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66  th -Dfdatasync=f
16590 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20  datasync.*/.#if 
165a0 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
165b0 6e 63 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  nc) && !defined(
165c0 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66  __linux__).# def
165d0 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
165e0 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
165f0 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
16600 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
16610 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
16620 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
16630 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
16640 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
16650 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
16660 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
16670 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
16680 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
16690 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
166a0 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
166b0 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
166c0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
166d0 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
166e0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
166f0 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
16700 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
16710 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
16720 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
16730 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
16740 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
16750 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
16760 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
16770 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
16780 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
16790 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
167a0 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
167b0 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
167c0 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
167d0 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
167e0 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
167f0 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
16800 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
16810 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
16820 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
16830 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
16840 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
16850 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
16860 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
16870 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
16880 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
16890 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
168a0 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
168b0 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
168c0 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
168d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
168e0 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20  SQLite sets the 
168f0 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66  dataOnly flag if
16900 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16910 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67   file is unchang
16920 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ed..** The idea 
16930 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20  behind dataOnly 
16940 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  is that it shoul
16950 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65  d only write the
16960 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a   file content.**
16970 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68   to disk, not th
16980 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c  e inode.  We onl
16990 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69  y set dataOnly i
169a0 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  f the file size 
169b0 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  is .** unchanged
169c0 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20   since the file 
169d0 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20  size is part of 
169e0 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65  the inode.  Howe
169f0 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27  ver, .** Ted Ts'
16a00 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20  o tells us that 
16a10 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
16a20 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
16a30 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20  inode if the.** 
16a40 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68  file size has ch
16a50 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79  anged.  The only
16a60 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65   real difference
16a70 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79   between fdatasy
16a80 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e  nc().** and fsyn
16a90 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75  c(), Ted tells u
16aa0 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61  s, is that fdata
16ab0 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20  sync() will not 
16ac0 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f  flush the.** ino
16ad0 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20  de if the mtime 
16ae0 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65  or owner or othe
16af0 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74  r inode attribut
16b00 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e  es have changed.
16b10 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65  .** We only care
16b20 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
16b30 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  size, not the ot
16b40 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75  her file attribu
16b50 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61  tes, so.** as fa
16b60 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63  r as SQLite is c
16b70 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61  oncerned, an fda
16b80 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61  tasync() is alwa
16b90 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20  ys adequate..** 
16ba0 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  So, we always us
16bb0 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66  e fdatasync() if
16bc0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
16bd0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  , regardless of.
16be0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
16bf0 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
16c00 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
16c10 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
16c20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
16c30 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
16c40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
16c50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
16c60 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
16c70 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
16c80 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
16c90 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
16ca0 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
16cb0 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
16cc0 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
16cd0 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
16ce0 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
16cf0 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
16d00 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
16d10 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
16d20 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
16d30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16d40 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
16d50 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
16d60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16d70 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16d80 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
16d90 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
16da0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
16db0 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
16dc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
16dd0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
16de0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
16df0 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nly);.#endif..  
16e00 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
16e10 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
16e20 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
16e30 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
16e40 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
16e50 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
16e60 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
16e70 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
16e80 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
16e90 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
16ea0 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
16eb0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
16ec0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16ed0 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
16ee0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
16ef0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
16f00 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
16f10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
16f20 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
16f30 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
16f40 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
16f50 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
16f60 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
16f70 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16f80 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
16f90 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
16fa0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
16fb0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
16fc0 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46  rc = fcntl(fd, F
16fd0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
16fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
16ff0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
17000 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
17010 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
17020 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
17030 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
17040 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
17050 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
17060 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
17070 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
17080 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
17090 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
170a0 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
170b0 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
170c0 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
170d0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
170e0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
170f0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
17100 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
17110 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
17120 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
17130 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
17140 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
17150 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
17160 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
17170 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
17180 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
17190 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
171a0 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
171b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
171c0 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
171d0 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  ;..#else .  rc =
171e0 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
171f0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
17200 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
17210 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
17220 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
17230 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
17240 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
17250 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
17260 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
17270 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
17280 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
17290 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
172a0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
172b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
172c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
172d0 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
172e0 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
172f0 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
17300 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
17310 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
17320 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
17330 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
17340 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
17350 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
17360 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
17370 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
17380 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
17390 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
173a0 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
173b0 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
173c0 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
173d0 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
173e0 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
173f0 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
17400 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
17410 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
17420 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
17430 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
17440 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
17450 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
17460 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
17470 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
17480 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
17490 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
174a0 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
174b0 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
174c0 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
174d0 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
174e0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
174f0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
17500 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
17510 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
17520 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
17530 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
17540 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
17550 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
17560 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
17570 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
17580 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
17590 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
175a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
175b0 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
175c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
175d0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
175e0 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
175f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17600 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
17610 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
17620 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
17630 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
17640 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
17650 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
17660 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
17670 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
17680 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
17690 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
176a0 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
176b0 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
176c0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
176d0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
176e0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
176f0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
17700 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
17710 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
17720 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
17730 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
17740 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
17750 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
17760 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
17770 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
17780 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
17790 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
177a0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
177b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
177c0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
177d0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
177e0 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64  E2("SYNC    %-3d
177f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
17800 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
17810 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
17820 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
17830 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
17840 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
17850 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17860 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17870 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
17880 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17890 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69  R_FSYNC;.  }.  i
178a0 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
178b0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72  =0 ){.    int er
178c0 72 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  r;.    OSTRACE4(
178d0 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
178e0 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
178f0 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
17900 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
17910 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
17920 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
17930 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66  llsync);.#ifndef
17940 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
17950 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
17960 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
17970 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
17980 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
17990 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
179a0 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
179b0 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
179c0 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
179d0 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
179e0 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
179f0 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
17a00 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
17a10 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
17a20 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c  LFSYNC || !isFul
17a30 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lsync) && full_f
17a40 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
17a50 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
17a60 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
17a70 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
17a80 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
17a90 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
17aa0 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
17ab0 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
17ac0 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
17ad0 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
17ae0 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
17af0 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
17b00 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
17b10 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
17b20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
17b30 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
17b40 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
17b50 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
17b60 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
17b70 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74    /* pFile->last
17b80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a  Errno = errno; *
17b90 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  /.       /* retu
17ba0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
17bb0 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
17bc0 0a 20 20 20 20 65 72 72 20 3d 20 63 6c 6f 73 65  .    err = close
17bd0 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20  (pFile->dirfd); 
17be0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  /* Only need to 
17bf0 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c  sync once, so cl
17c00 6f 73 65 20 74 68 65 20 2a 2f 0a 20 20 20 20 69  ose the */.    i
17c10 66 28 20 65 72 72 3d 3d 30 20 29 7b 20 20 20 20  f( err==0 ){    
17c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69 72            /* dir
17c30 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20 61  ectory when we a
17c40 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  re done */.     
17c50 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
17c60 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
17c70 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17c80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17c90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17ca0 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
17cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17cd0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
17ce0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
17cf0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
17d00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
17d10 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
17d20 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
17d30 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  te){.  int rc;. 
17d40 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
17d50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17d60 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
17d70 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29  IOERR_TRUNCATE )
17d80 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61  ;.  rc = ftrunca
17d90 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  te(((unixFile*)i
17da0 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  d)->h, (off_t)nB
17db0 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
17dc0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
17dd0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
17de0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
17df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17e00 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65  R_TRUNCATE;.  }e
17e10 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
17e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
17e30 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
17e40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
17e50 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
17e60 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
17e70 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
17e80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17e90 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
17ea0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
17eb0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
17ec0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
17ed0 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
17ee0 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
17ef0 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
17f00 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
17f10 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
17f20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17f30 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17f40 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
17f50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
17f60 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
17f70 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
17f80 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
17f90 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
17fa0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
17fb0 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72  indLockInfo() pr
17fc0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
17fd0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
17fe0 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
17ff0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
18000 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
18010 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
18020 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
18030 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
18040 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
18050 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
18060 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
18070 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
18080 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
18090 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
180a0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
180b0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
180c0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
180d0 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
180e0 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
180f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
18100 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18110 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
18120 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18130 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
18140 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
18150 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
18160 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
18170 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
18180 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
18190 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
181a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
181b0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
181c0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
181d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
181e0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
181f0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
18200 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
18210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18220 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
18230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18240 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
18250 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
18260 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
18270 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
18280 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
18290 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
182a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
182b0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72  ocktype;.      r
182c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
182d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
182e0 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
182f0 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
18300 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
18310 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18320 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
18330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18340 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
18350 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
18360 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
18370 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
18380 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
18390 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
183a0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
183b0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
183c0 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
183d0 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
183e0 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
183f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18400 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
18410 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
18420 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
18430 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18440 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
18450 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
18460 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
18470 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
18480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18490 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
184a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
184b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
184c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
184d0 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
184e0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
184f0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
18500 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
18510 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
18520 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
18530 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
18540 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
18550 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
18560 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18570 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
18580 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
18590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
185a0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
185b0 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
185c0 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
185d0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
185e0 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
185f0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
18600 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
18610 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
18620 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
18630 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
18640 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
18650 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
18660 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
18670 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
18680 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
18690 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
186a0 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
186b0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
186c0 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
186d0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
186e0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
186f0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
18700 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
18710 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
18720 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
18730 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
18740 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
18750 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
18760 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
18770 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
18780 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
18790 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
187a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
187b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
187c0 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
187d0 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
187e0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
187f0 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78  lways 0 for unix
18800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18810 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
18820 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
18830 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
18840 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
18850 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
18860 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18870 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
18880 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
18890 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
188a0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
188b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
188c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
188d0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
188e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
18950 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
18960 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
18970 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
18980 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
18990 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
189a0 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
189b0 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
189c0 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
189d0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
189e0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
189f0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
18a00 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
18a10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
18a20 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
18a30 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
18a40 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
18a50 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
18a60 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
18a70 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
18a80 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
18a90 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
18aa0 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
18ab0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
18ac0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
18ad0 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
18ae0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
18af0 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
18b00 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
18b10 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
18b20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
18b30 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
18b40 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
18b50 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
18b60 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
18b70 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
18b80 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
18b90 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
18ba0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
18bb0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
18bc0 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
18bd0 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
18be0 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
18bf0 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
18c00 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ntion F, two obj
18c10 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
18c20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
18c30 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
18c40 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
18c50 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
18c60 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
18c70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18c80 20 66 75 6e 63 74 69 6f 20 6e 61 6d 65 64 20 6a   functio named j
18c90 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
18ca0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
18cb0 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
18cc0 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
18cd0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
18ce0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
18cf0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
18d00 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
18d10 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
18d20 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
18d30 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
18d40 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
18d50 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
18d60 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
18d70 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
18d80 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
18d90 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
18da0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
18db0 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
18dc0 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
18dd0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
18de0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
18df0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
18e00 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
18e10 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
18e20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
18e30 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
18e40 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
18e50 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
18e60 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
18e70 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
18e80 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
18e90 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
18ea0 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
18eb0 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
18ec0 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
18ed0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
18ee0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
18ef0 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
18f00 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
18f20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
18f30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
18f40 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18f70 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f90 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
18fc0 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18fe0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
19010 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
19020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
19030 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
19060 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
19070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
19080 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
190b0 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
190c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
190d0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
19100 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
19110 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
19120 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
19150 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
19160 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
19170 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19190 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
191c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
19210 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
19260 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19280 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
19290 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
192a0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
192b0 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
192e0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
192f0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
19300 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
19330 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20  haracteristics  
19340 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
19350 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19370 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
193c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
193d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
193e0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
193f0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
19400 20 68 29 7b 20 20 20 20 20 20 20 20 20 5c 0a 20   h){         \. 
19410 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19420 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
19430 41 4d 45 54 45 52 28 68 29 3b 20 20 20 20 20 20  AMETER(h);      
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19460 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
19500 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
19510 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
19520 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
19530 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 20 20 20  st char*,int)   
19540 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 3d           \.    =
19550 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
19560 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
19570 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
19580 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
19590 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
195a0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
195b0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
195c0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
195d0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
195e0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
195f0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
19600 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
19610 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
19620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19630 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
19640 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
19650 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
19660 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
19670 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
19680 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  name */.  unixCl
19690 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
196a0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
196b0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
196c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
196d0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
196e0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
196f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
19700 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
19710 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
19720 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
19730 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
19740 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
19750 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
19760 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
19770 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
19780 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
19790 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
197a0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
197b0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
197c0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
197d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
197e0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
197f0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
19800 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
19810 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
19820 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
19830 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
19840 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
19850 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
19860 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
19870 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
19880 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
19890 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
198a0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
198b0 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
198c0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
198d0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
198e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
198f0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
19900 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
19910 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
19920 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  t name */.  dotl
19930 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
19940 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
19950 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
19960 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
19970 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
19980 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
19990 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
199a0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
199b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
199c0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
199d0 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52  Lock  /* xCheckR
199e0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
199f0 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
19a00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
19a10 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
19a20 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
19a30 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  S(.  flockIoFind
19a40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
19a50 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
19a60 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  n name */.  floc
19a70 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
19a80 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
19a90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
19aa0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  ct name */.  flo
19ab0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
19ac0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
19ad0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
19ae0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
19af0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
19b00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
19b10 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
19b20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
19b30 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
19b40 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
19b50 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
19b60 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
19b70 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
19b80 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
19b90 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
19ba0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
19bb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
19bc0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
19bd0 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
19be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19bf0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
19c00 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
19c10 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c30 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
19c40 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c60 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
19c70 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c90 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
19ca0 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
19cb0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
19cc0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
19cd0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
19ce0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
19cf0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19d00 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19d10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
19d20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
19d30 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
19d40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
19d50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
19d60 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19d90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
19da0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19dc0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
19dd0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19df0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
19e00 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
19e30 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
19e40 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
19e50 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
19e60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
19e70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
19e80 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
19e90 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
19ea0 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
19eb0 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
19ec0 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
19ed0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
19ee0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
19ef0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
19f00 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
19f10 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
19f20 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
19f30 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
19f40 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
19f50 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
19f60 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
19f70 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
19f80 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
19f90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
19fa0 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
19fb0 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
19fc0 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
19fd0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
19fe0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
19ff0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
1a000 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
1a010 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
1a020 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
1a030 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
1a040 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
1a050 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
1a060 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1a070 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1a080 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1a090 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
1a0a0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
1a0b0 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
1a0c0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
1a0d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
1a0e0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
1a0f0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
1a100 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1a110 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
1a120 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
1a130 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1a140 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
1a150 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
1a160 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1a170 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1a180 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
1a190 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
1a1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1a1b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1a1c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1a1d0 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
1a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1a1f0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1a200 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
1a210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1a220 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1a230 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
1a240 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1a250 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1a260 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
1a270 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
1a280 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1a290 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
1a2a0 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  if...#if defined
1a2b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1a2c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1a2d0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
1a2e0 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
1a2f0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1a300 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
1a310 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
1a320 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
1a330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a340 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
1a350 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
1a360 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
1a370 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
1a380 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
1a390 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
1a3a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
1a3b0 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
1a3c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
1a3d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1a3e0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
1a3f0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
1a400 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
1a410 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
1a420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a430 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20 20 20 20   */.  int fd    
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a450 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
1a460 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1a470 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
1a480 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1a490 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
1a4a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1a4b0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a4d0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
1a4e0 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
1a4f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a500 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
1a510 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
1a520 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
1a530 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
1a540 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
1a550 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1a560 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
1a570 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
1a580 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
1a590 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
1a5a0 68 6f 64 73 20 7d 2c 0a 23 69 66 64 65 66 20 53  hods },.#ifdef S
1a5b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50  QLITE_ENABLE_AFP
1a5c0 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20  _LOCKING_SMB.   
1a5d0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
1a5e0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65  pIoMethods },.#e
1a5f0 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d 62 66 73  lse.    { "smbfs
1a600 22 2c 20 20 26 66 6c 6f 63 6b 49 6f 4d 65 74 68  ",  &flockIoMeth
1a610 6f 64 73 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  ods },.#endif.  
1a620 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
1a630 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
1a640 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
1a650 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
1a660 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
1a670 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
1a680 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
1a690 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
1a6a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
1a6b0 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
1a6c0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
1a6d0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
1a6e0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
1a6f0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
1a700 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
1a710 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
1a720 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1a730 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
1a740 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
1a750 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
1a760 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
1a770 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
1a780 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
1a790 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
1a7a0 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
1a7b0 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
1a7c0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
1a7d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
1a7e0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
1a7f0 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
1a800 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
1a810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1a820 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
1a830 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
1a840 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
1a850 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
1a860 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
1a870 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
1a880 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
1a890 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
1a8a0 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
1a8b0 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
1a8c0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
1a8d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
1a8e0 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
1a8f0 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
1a900 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
1a910 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
1a920 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
1a930 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
1a940 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
1a950 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
1a960 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
1a970 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
1a980 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
1a990 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
1a9a0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1a9b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a9c0 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
1a9d0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
1a9e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1a9f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1aa00 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
1aa10 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
1aa20 63 68 61 72 2a 2c 69 6e 74 29 0a 20 20 20 20 20  char*,int).     
1aa30 20 20 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46     = autolockIoF
1aa40 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
1aa50 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1aa60 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1aa70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1aa80 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
1aa90 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
1aaa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1aab0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
1aac0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
1aad0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1aae0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1aaf0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
1ab00 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
1ab10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ab20 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
1ab30 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
1ab40 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1ab50 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
1ab60 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
1ab70 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
1ab80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
1ab90 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
1aba0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
1abb0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1abc0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
1abd0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
1abe0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
1abf0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
1ac00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ac10 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20 20 20 20   */.  int fd    
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac30 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
1ac40 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1ac50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
1ac60 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
1ac70 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
1ac80 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
1ac90 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
1aca0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
1acb0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1acc0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
1acd0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
1ace0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1acf0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
1ad00 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
1ad10 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1ad20 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
1ad30 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
1ad40 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
1ad50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
1ad60 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
1ad70 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
1ad80 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
1ad90 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
1ada0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
1adb0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
1adc0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
1add0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
1ade0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
1adf0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
1ae00 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
1ae10 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
1ae20 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
1ae30 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
1ae40 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1ae50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ae60 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
1ae70 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
1ae80 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1ae90 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
1aea0 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
1aeb0 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
1aec0 2a 2c 69 6e 74 29 0a 20 20 20 20 20 20 20 20 3d  *,int).        =
1aed0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
1aee0 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
1aef0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
1af00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1af10 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
1af20 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
1af30 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
1af40 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
1af50 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1af60 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
1af70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1af80 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
1af90 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
1afa0 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 0a 2f 2a 2a  har*,int);.../**
1afb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b010 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
1b020 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b040 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
1b050 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
1b060 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
1b070 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
1b080 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
1b090 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
1b0a0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
1b0b0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
1b0c0 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
1b0d0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
1b0e0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
1b0f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1b100 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
1b110 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1b120 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
1b130 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
1b140 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b160 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
1b170 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
1b180 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
1b190 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
1b1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
1b1b0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1b1c0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
1b1d0 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
1b1e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
1b1f0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1b200 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
1b210 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1b220 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
1b230 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
1b240 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
1b250 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20  t noLock,       
1b260 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f        /* Omit lo
1b270 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  cking if true */
1b280 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
1b290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1b2a0 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
1b2b0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   true */.){.  co
1b2c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1b2d0 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
1b2e0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
1b2f0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
1b300 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
1b310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
1b330 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b  ->pLock==NULL );
1b340 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1b350 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a  >pOpen==NULL );.
1b360 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  .  /* Parameter 
1b370 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79  isDelete is only
1b380 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73   used on vxworks
1b390 2e 0a 20 20 2a 2a 20 45 78 70 72 65 73 73 20 74  ..  ** Express t
1b3a0 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 68  his explicitly h
1b3b0 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
1b3c0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1b3d0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 75 6e 75 73  .  ** about unus
1b3e0 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
1b3f0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
1b400 52 4b 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  RKS.  UNUSED_PAR
1b410 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
1b420 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
1b430 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE3("OPEN    %-
1b440 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
1b450 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70  lename);    .  p
1b460 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
1b470 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
1b480 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  d;.  SET_THREADI
1b490 44 28 70 4e 65 77 29 3b 0a 0a 23 69 66 20 4f 53  D(pNew);..#if OS
1b4a0 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
1b4b0 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
1b4c0 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
1b4d0 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
1b4e0 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  >pId==0 ){.    n
1b4f0 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  oLock = 1;.    r
1b500 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1b510 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b520 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  if( noLock ){.  
1b530 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
1b540 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
1b550 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
1b560 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1b570 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
1b580 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
1b590 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b  )(zFilename, h);
1b5a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1b5b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1b5c0 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
1b5d0 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
1b5e0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
1b5f0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
1b600 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
1b610 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
1b620 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
1b630 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
1b640 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
1b650 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
1b660 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
1b670 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
1b680 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
1b690 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
1b6a0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
1b6b0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
1b6c0 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
1b6d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
1b6e0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
1b6f0 69 78 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ixIoMethods ){. 
1b700 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
1b710 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
1b720 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c  ndLockInfo(pNew,
1b730 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26   &pNew->pLock, &
1b740 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  pNew->pOpen);.  
1b750 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1b760 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
1b770 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b780 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1b790 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1b7a0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
1b7b0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
1b7c0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
1b7d0 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
1b7e0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
1b7f0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
1b800 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
1b810 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
1b820 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
1b830 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
1b840 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
1b850 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
1b860 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
1b870 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
1b880 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
1b890 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
1b8a0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1b8b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1b8c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b8d0 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
1b8e0 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
1b8f0 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
1b900 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
1b910 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
1b920 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
1b930 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
1b940 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
1b950 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
1b960 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
1b970 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
1b980 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
1b990 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
1b9a0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
1b9b0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
1b9c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
1b9d0 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
1b9e0 6f 28 70 4e 65 77 2c 20 4e 55 4c 4c 2c 20 26 70  o(pNew, NULL, &p
1b9f0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1ba00 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
1ba10 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
1ba20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1ba30 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
1ba40 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
1ba50 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
1ba60 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
1ba70 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1ba80 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1ba90 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
1baa0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
1bab0 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
1bac0 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
1bad0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
1bae0 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
1baf0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69  ilename;.    nFi
1bb00 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
1bb10 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
1bb20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
1bb30 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
1bb40 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
1bb50 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
1bb60 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
1bb70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bb80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1bb90 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1bba0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
1bbb0 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
1bbc0 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
1bbd0 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
1bbe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
1bbf0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1bc00 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
1bc10 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
1bc20 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
1bc30 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
1bc40 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
1bc50 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
1bc60 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
1bc70 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
1bc80 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
1bc90 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
1bca0 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
1bcb0 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
1bcc0 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
1bcd0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
1bce0 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
1bcf0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63  New, &pNew->pLoc
1bd00 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  k, &pNew->pOpen)
1bd10 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
1bd20 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
1bd30 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d  ew->pOpen->pSem=
1bd40 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
1bd50 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
1bd60 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53   pNew->pOpen->aS
1bd70 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
1bd80 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
1bd90 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1bda0 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
1bdb0 6d 65 2c 20 22 25 73 2e 73 65 6d 22 2c 0a 20 20  me, "%s.sem",.  
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
1bde0 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
1bdf0 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b  .      for( n=0;
1be00 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
1be10 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
1be20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
1be30 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
1be40 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
1be50 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20  ->pOpen->pSem = 
1be60 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
1be70 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
1be80 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1be90 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  pNew->pOpen->pSe
1bea0 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
1beb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bec0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bed0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65        pNew->pOpe
1bee0 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  n->aSemName[0] =
1bef0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
1bf00 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
1bf10 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
1bf20 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
1bf30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
1bf40 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1bf50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bf60 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  OK ){.    unlink
1bf70 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
1bf80 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20   isDelete = 0;. 
1bf90 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c   }.  pNew->isDel
1bfa0 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a  ete = isDelete;.
1bfb0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
1bfc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfd0 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
1bfe0 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f   close(dirfd); /
1bff0 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66  * silent leak if
1c000 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69   fail, already i
1c010 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63  n error */.    c
1c020 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65  lose(h);.  }else
1c030 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
1c040 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
1c050 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
1c060 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
1c070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c080 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1c090 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1c0a0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1c0b0 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1c0c0 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1c0d0 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1c0e0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1c0f0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1c100 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1c110 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1c120 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c130 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1c140 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1c150 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1c160 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1c170 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1c180 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1c190 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  lue..**.** If SQ
1c1a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c1b0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1c1c0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1c1d0 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1c1e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1c1f0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1c200 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1c210 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1c220 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1c230 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1c240 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1c250 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1c260 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1c270 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1c280 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1c290 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1c2a0 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1c2b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1c2c0 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1c2d0 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
1c2e0 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1c2f0 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1c300 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1c310 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1c320 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70  \0';.    fd = op
1c330 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1c340 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1c350 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1c360 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43  0 ){.#ifdef FD_C
1c370 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63 6e  LOEXEC.      fcn
1c380 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
1c390 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
1c3a0 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
1c3b0 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EC);.#endif.    
1c3c0 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e    OSTRACE3("OPEN
1c3d0 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
1c3e0 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20  fd, zDirname);. 
1c3f0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1c400 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1c410 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1c420 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
1c430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c440 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
1c450 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
1c460 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61    zBuf must be a
1c470 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
1c480 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1c490 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62  ss and must be b
1c4a0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
1c4b0 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56  d at least.** pV
1c4c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62  fs->mxPathname b
1c4d0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
1c4e0 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
1c4f0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1c500 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
1c510 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
1c520 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
1c530 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
1c540 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
1c550 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
1c560 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
1c570 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
1c580 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c590 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
1c5a0 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
1c5b0 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
1c5c0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
1c5d0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
1c5e0 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
1c5f0 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ";.  unsigned in
1c600 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
1c610 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
1c620 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
1c630 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  ".";..  /* It's 
1c640 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
1c650 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
1c660 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
1c670 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
1c680 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
1c690 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
1c6a0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
1c6b0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
1c6c0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1c6d0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
1c6e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c6f0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1c700 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69  IOERR );..  azDi
1c710 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
1c720 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
1c730 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a    if (NULL == az
1c740 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61  Dirs[1]) {.    a
1c750 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
1c760 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d  v("TMPDIR");.  }
1c770 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  .  .  for(i=0; i
1c780 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
1c790 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
1c7a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
1c7b0 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20   azDirs[i]==0 ) 
1c7c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1c7d0 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d  ( stat(azDirs[i]
1c7e0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
1c7f0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
1c800 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
1c810 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1c820 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44    if( access(azD
1c830 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f  irs[i], 07) ) co
1c840 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72  ntinue;.    zDir
1c850 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20   = azDirs[i];.  
1c860 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
1c870 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1c880 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
1c890 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
1c8a0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
1c8b0 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
1c8c0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
1c8d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c8e0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
1c8f0 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
1c900 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
1c910 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
1c920 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f   + 17) >= (size_
1c930 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  t)nBuf ){.    re
1c940 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c950 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
1c960 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1c970 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66  tf(nBuf-17, zBuf
1c980 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
1c990 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
1c9a0 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
1c9b0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
1c9c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
1c9d0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
1c9e0 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
1c9f0 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
1ca00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
1ca10 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
1ca20 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
1ca30 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
1ca40 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
1ca50 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
1ca60 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
1ca70 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c  le( access(zBuf,
1ca80 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
1ca90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1caa0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1cab0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1cac0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1cad0 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
1cae0 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
1caf0 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
1cb00 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
1cb10 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
1cb20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
1cb30 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
1cb40 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
1cb50 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
1cb60 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
1cb70 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
1cb80 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
1cb90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1cba0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
1cbb0 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
1cbc0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
1cbd0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  if.../*.** Open 
1cbe0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
1cbf0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
1cc00 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
1cc10 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
1cc20 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
1cc30 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
1cc40 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
1cc50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
1cc60 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
1cc70 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
1cc80 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
1cc90 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
1cca0 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
1ccb0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
1ccc0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
1ccd0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
1cce0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
1ccf0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
1cd00 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
1cd10 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
1cd20 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
1cd30 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
1cd40 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
1cd50 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
1cd60 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
1cd70 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
1cd80 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
1cd90 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
1cda0 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
1cdb0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
1cdc0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
1cdd0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
1cde0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
1cdf0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
1ce00 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1ce10 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
1ce20 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
1ce30 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
1ce40 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
1ce50 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
1ce60 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
1ce70 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
1ce80 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
1ce90 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
1cea0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
1ceb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1cec0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
1ced0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1cee0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1cef0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
1cf00 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
1cf10 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
1cf20 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
1cf30 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
1cf40 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
1cf50 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
1cf60 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1cf70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cf80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1cf90 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
1cfa0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
1cfd0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
1cfe0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
1cff0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
1d000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1d010 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
1d020 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
1d030 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 66 64  e */.){.  int fd
1d040 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
1d050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1d060 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
1d070 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
1d080 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  */.  int dirfd =
1d090 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
1d0a0 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1d0b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d0c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
1d0d0 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
1d0e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
1d0f0 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
1d100 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
1d110 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
1d120 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
1d130 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
1d140 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
1d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d160 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
1d170 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
1d180 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
1d190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1d1a0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
1d1b0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1d1c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1d1d0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
1d1e0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1d1f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1d200 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
1d210 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
1d220 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1d230 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1d240 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
1d250 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1d260 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1d270 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
1d280 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
1d290 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1d2a0 45 41 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a  EADWRITE);..  /*
1d2b0 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
1d2c0 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
1d2d0 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
1d2e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
1d2f0 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
1d300 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
1d310 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
1d320 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1d330 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
1d340 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
1d350 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1d360 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1d370 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
1d380 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
1d390 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  nt isOpenDirecto
1d3a0 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ry = (isCreate &
1d3b0 26 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d  & .      (eType=
1d3c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
1d3d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  TER_JOURNAL || e
1d3e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1d3f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
1d400 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72    );..  /* If ar
1d410 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
1d420 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
1d430 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d440 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
1d450 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
1d460 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
1d470 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
1d480 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
1d490 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
1d4a0 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
1d4b0 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73  HNAME+1];.  cons
1d4c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
1d4d0 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
1d4e0 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
1d4f0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
1d500 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
1d510 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
1d520 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
1d530 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
1d540 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
1d550 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
1d560 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
1d570 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
1d580 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
1d590 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
1d5a0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
1d5b0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
1d5c0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1d5d0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
1d5e0 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
1d5f0 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
1d600 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
1d610 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
1d620 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
1d630 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
1d640 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
1d650 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
1d660 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
1d670 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
1d680 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
1d690 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
1d6a0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
1d6b0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
1d6c0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
1d6d0 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
1d6e0 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
1d6f0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20  in journal, and 
1d700 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
1d710 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74  re never automat
1d720 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65  ically.  ** dele
1d730 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ted.  */.  asser
1d740 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
1d750 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c  _OPEN_MAIN_DB ||
1d760 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20   !isDelete );.  
1d770 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
1d780 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1d790 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65  JOURNAL || !isDe
1d7a0 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  lete );.  assert
1d7b0 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  ( eType!=SQLITE_
1d7c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1d7d0 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  NAL || !isDelete
1d7e0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1d7f0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
1d800 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
1d810 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
1d820 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
1d830 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1d840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1d850 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
1d860 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
1d870 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
1d880 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1d890 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1d8a0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
1d8b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
1d8c0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
1d8d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1d8e0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
1d8f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1d900 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1d910 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
1d920 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1d930 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a  EN_TRANSIENT_DB.
1d940 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
1d950 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
1d960 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
1d970 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
1d980 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
1d990 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63   && !isOpenDirec
1d9a0 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  tory);.    rc = 
1d9b0 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
1d9c0 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
1d9d0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
1d9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d9f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1da00 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
1da10 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
1da20 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ..  if( isReadon
1da30 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
1da40 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
1da50 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
1da60 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
1da70 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
1da80 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
1da90 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
1daa0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
1dab0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
1dac0 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
1dad0 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
1dae0 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
1daf0 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
1db00 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c  fd = open(zName,
1db10 20 6f 70 65 6e 46 6c 61 67 73 2c 20 69 73 44 65   openFlags, isDe
1db20 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49 54 45  lete?0600:SQLITE
1db30 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1db40 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 4f 53  RMISSIONS);.  OS
1db50 54 52 41 43 45 34 28 22 4f 50 45 4e 58 20 20 20  TRACE4("OPENX   
1db60 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
1db70 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
1db80 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 66 64 3c  lags);.  if( fd<
1db90 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
1dba0 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
1dbb0 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
1dbc0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c  e ){.    /* Fail
1dbd0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
1dbe0 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
1dbf0 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
1dc00 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
1dc10 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
1dc20 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1dc30 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
1dc40 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73  EATE);.    flags
1dc50 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
1dc60 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65  READONLY;.    re
1dc70 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56  turn unixOpen(pV
1dc80 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65  fs, zPath, pFile
1dc90 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
1dca0 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  gs);.  }.  if( f
1dcb0 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
1dcc0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1dcd0 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44  N;.  }.  if( isD
1dce0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
1dcf0 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
1dd00 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65  h = zName;.#else
1dd10 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d  .    unlink(zNam
1dd20 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
1dd30 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1dd40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
1dd50 20 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e 69   else{.    ((uni
1dd60 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6f  xFile*)pFile)->o
1dd70 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
1dd80 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
1dd90 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
1dda0 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
1ddb0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
1ddc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ddd0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1dde0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1ddf0 44 42 29 21 3d 30 20 29 7b 0a 20 20 20 20 28 28  DB)!=0 ){.    ((
1de00 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
1de10 2d 3e 69 73 4c 6f 63 6b 61 62 6c 65 20 3d 20 31  ->isLockable = 1
1de20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1de30 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
1de40 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72  .  if( isOpenDir
1de50 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63  ectory ){.    rc
1de60 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
1de70 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
1de80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1de90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dea0 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
1deb0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
1dec0 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20  ail, already in 
1ded0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
1dee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1def0 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43    }..#ifdef FD_C
1df00 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66  LOEXEC.  fcntl(f
1df10 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
1df20 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
1df30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
1df40 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
1df50 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
1df60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
1df70 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
1df80 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
1df90 0a 20 20 69 66 28 20 7a 50 61 74 68 21 3d 4e 55  .  if( zPath!=NU
1dfa0 4c 4c 20 26 26 20 21 6e 6f 4c 6f 63 6b 20 29 7b  LL && !noLock ){
1dfb0 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
1dfc0 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
1dfd0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
1dfe0 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
1dff0 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
1e000 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
1e010 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
1e020 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
1e030 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
1e040 72 6f 78 79 2c 20 0a 20 20 20 20 2a 2a 20 30 20  roxy, .    ** 0 
1e050 6d 65 61 6e 73 20 6e 65 76 65 72 20 75 73 65 20  means never use 
1e060 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
1e070 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
1e080 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
1e090 6f 6e 6c 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  only.    */.    
1e0a0 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
1e0b0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
1e0c0 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
1e0d0 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
1e0e0 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  se{.      struct
1e0f0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
1e100 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
1e110 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
1e120 29 20 3d 3d 20 2d 31 20 29 7b 0a 09 09 09 09 28  ) == -1 ){.....(
1e130 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
1e140 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1e150 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
1e160 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ( dirfd>=0 ) clo
1e170 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69  se(dirfd); /* si
1e180 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
1e190 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
1e1a0 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 66  .        close(f
1e1b0 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
1e1c0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
1e1d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1e1e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e1f0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
1e200 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50      }.      useP
1e210 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
1e220 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
1e230 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
1e240 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
1e250 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
1e260 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
1e270 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
1e280 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69  zPath, noLock, i
1e290 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  sDelete);.      
1e2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e2b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1e2c0 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
1e2d0 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69  UnixFile((unixFi
1e2e0 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74  le*)pFile, ":aut
1e2f0 6f 3a 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o:");.      }.  
1e300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e310 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1e320 20 20 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 6c    .  return fill
1e330 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
1e340 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c   fd, dirfd, pFil
1e350 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
1e360 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a  , isDelete);.}..
1e370 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1e380 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
1e390 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
1e3a0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
1e3b0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
1e3c0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
1e3d0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
1e3e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e3f0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
1e400 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1e410 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
1e420 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
1e430 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
1e440 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
1e450 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
1e460 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1e470 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
1e480 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
1e490 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
1e4a0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
1e4b0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
1e4c0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
1e4d0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
1e4e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e4f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e500 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
1e510 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
1e520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e530 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e  RR_DELETE);.  un
1e540 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 23 69 66  link(zPath);.#if
1e550 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
1e560 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
1e570 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
1e580 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
1e590 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
1e5a0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
1e5b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e5c0 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
1e5d0 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
1e5e0 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
1e5f0 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
1e600 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
1e610 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1e620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1e630 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20  ERR_DIR_FSYNC;. 
1e640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e650 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20   close(fd)&&!rc 
1e660 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e670 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
1e680 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a  _CLOSE;.      }.
1e690 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e6a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e6b0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
1e6c0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
1e6d0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
1e6e0 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
1e6f0 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
1e700 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
1e710 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
1e720 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
1e730 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1e740 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
1e750 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
1e760 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
1e770 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
1e780 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
1e790 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
1e7a0 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
1e7b0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
1e7c0 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
1e7d0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
1e7e0 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
1e7f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
1e800 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
1e810 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
1e820 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
1e830 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
1e840 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
1e850 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
1e860 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
1e870 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
1e880 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
1e890 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
1e8a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
1e8b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1e8c0 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
1e8d0 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
1e8e0 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
1e8f0 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
1e900 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
1e910 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
1e920 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
1e930 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
1e940 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
1e950 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1e960 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e970 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1e980 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
1e990 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
1e9a0 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
1e9b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1e9c0 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
1e9d0 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
1e9e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1e9f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
1ea00 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
1ea10 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
1ea20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ea30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
1ea40 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
1ea50 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
1ea60 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1ea70 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1ea80 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
1ea90 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
1eaa0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
1eab0 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68   = (access(zPath
1eac0 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
1ead0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eae0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
1eaf0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1eb00 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
1eb10 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
1eb20 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
1eb30 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
1eb40 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
1eb50 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
1eb60 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
1eb70 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
1eb80 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
1eb90 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
1eba0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
1ebb0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
1ebc0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
1ebd0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
1ebe0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
1ebf0 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
1ec00 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
1ec10 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
1ec20 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1ec30 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
1ec40 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
1ec50 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1ec60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1ec70 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
1ec80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1ec90 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
1eca0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
1ecb0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
1ecc0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
1ecd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1ece0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ecf0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
1ed00 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
1ed10 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ed30 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
1ed40 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
1ed50 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
1ed60 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
1ed70 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
1ed80 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
1ed90 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
1eda0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
1edb0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
1edc0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
1edd0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
1ede0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
1edf0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
1ee00 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
1ee10 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
1ee20 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
1ee30 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
1ee40 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
1ee50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1ee60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1ee70 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
1ee80 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1ee90 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
1eea0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1eeb0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
1eec0 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
1eed0 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
1eee0 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
1eef0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ef00 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
1ef10 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
1ef20 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
1ef30 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77 64  ;.    if( getcwd
1ef40 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
1ef50 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1ef60 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1ef70 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  N;.    }.    nCw
1ef80 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
1ef90 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
1efa0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
1efb0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
1efc0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
1efd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1efe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
1eff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f000 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1f010 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
1f020 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
1f030 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
1f040 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
1f050 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
1f060 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
1f070 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
1f080 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
1f090 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
1f0a0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
1f0b0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
1f0c0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
1f0d0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
1f0e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1f0f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f100 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1f110 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
1f120 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
1f130 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
1f140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
1f150 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
1f160 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
1f170 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1f180 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
1f190 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
1f1a0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
1f1b0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
1f1c0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
1f1d0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
1f1e0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
1f1f0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
1f200 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
1f210 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
1f220 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
1f230 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
1f240 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
1f250 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
1f260 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
1f270 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
1f280 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
1f290 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
1f2a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
1f2b0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
1f2c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
1f2d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f2e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1f2f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1f300 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
1f310 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
1f320 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f330 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
1f340 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
1f350 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
1f360 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
1f370 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
1f380 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
1f390 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
1f3a0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
1f3b0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
1f3c0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
1f3d0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
1f3e0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
1f3f0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
1f400 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
1f410 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
1f420 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
1f430 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
1f440 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
1f450 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
1f460 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
1f470 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
1f480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1f490 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
1f4a0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
1f4b0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
1f4c0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
1f4d0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
1f4e0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
1f4f0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
1f500 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
1f510 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
1f520 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
1f530 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
1f540 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
1f550 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
1f560 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
1f570 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
1f580 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
1f590 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
1f5a0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
1f5b0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
1f5c0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
1f5d0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
1f5e0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
1f5f0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
1f600 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
1f610 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
1f620 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
1f630 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
1f640 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
1f650 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
1f660 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
1f670 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
1f680 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
1f690 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
1f6a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
1f6b0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
1f6c0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
1f6d0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
1f6e0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
1f6f0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
1f700 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
1f710 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
1f720 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
1f730 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
1f740 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f750 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
1f760 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
1f770 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
1f780 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
1f790 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
1f7a0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
1f7b0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
1f7c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1f7d0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
1f7e0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
1f7f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1f800 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
1f810 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
1f820 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
1f830 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
1f840 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
1f850 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
1f860 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
1f870 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
1f880 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
1f890 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
1f8a0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
1f8b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
1f8c0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
1f8d0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
1f8e0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
1f8f0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
1f900 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
1f910 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
1f920 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
1f930 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1f940 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1f950 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1f960 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
1f970 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
1f980 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
1f990 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
1f9a0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
1f9b0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
1f9c0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
1f9d0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
1f9e0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
1f9f0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
1fa00 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
1fa10 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
1fa20 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
1fa30 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
1fa40 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
1fa50 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
1fa60 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
1fa70 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
1fa80 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
1fa90 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
1faa0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
1fab0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
1fac0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
1fad0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
1fae0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
1faf0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
1fb00 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
1fb10 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
1fb20 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
1fb30 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
1fb40 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
1fb50 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
1fb60 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
1fb70 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
1fb80 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
1fb90 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
1fba0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
1fbb0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1fbc0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
1fbd0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
1fbe0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
1fbf0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
1fc00 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
1fc10 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
1fc20 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
1fc30 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
1fc40 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
1fc50 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
1fc60 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
1fc70 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
1fc80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
1fc90 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
1fca0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
1fcb0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
1fcc0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
1fcd0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
1fce0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1fcf0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
1fd00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
1fd10 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
1fd20 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
1fd30 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
1fd40 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
1fd50 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
1fd60 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
1fd70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fd80 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
1fd90 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
1fda0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
1fdb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1fdc0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
1fdd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
1fde0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
1fdf0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
1fe00 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
1fe10 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
1fe20 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
1fe30 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
1fe40 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
1fe50 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
1fe60 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
1fe70 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
1fe80 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
1fe90 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
1fea0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
1feb0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
1fec0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
1fed0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
1fee0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
1fef0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1ff00 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
1ff10 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
1ff20 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
1ff30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff40 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
1ff50 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
1ff60 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
1ff70 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
1ff80 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
1ff90 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
1ffa0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
1ffb0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
1ffc0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
1ffd0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
1ffe0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
1fff0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
20000 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
20010 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
20020 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
20030 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
20040 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
20050 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
20060 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
20070 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
20080 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20090 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
200a0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
200b0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
200c0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
200d0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
200e0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
200f0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
20100 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
20110 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
20120 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
20130 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
20140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
20150 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
20160 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
20170 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
20180 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
20190 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
201a0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
201b0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
201c0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
201d0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
201e0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
201f0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
20200 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
20210 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
20220 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
20230 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
20240 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
20250 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
20260 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
20270 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
20280 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
20290 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
202a0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
202b0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
202c0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
202d0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
202e0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
202f0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
20300 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
20310 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
20320 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
20330 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
20340 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
20350 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
20360 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65 66 69  prNow){.#if defi
20370 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
20380 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
20390 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  e(&t);.  *prNow 
203a0 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  = t/86400.0 + 24
203b0 34 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f  40587.5;.#elif O
203c0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
203d0 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
203e0 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
203f0 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
20400 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e  , &sNow);.  *prN
20410 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
20420 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
20430 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  00.0 + sNow.tv_n
20440 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 30  sec/864000000000
20450 30 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  00.0;.#else.  st
20460 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
20470 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
20480 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
20490 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e  prNow = 2440587.
204a0 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f  5 + sNow.tv_sec/
204b0 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74  86400.0 + sNow.t
204c0 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30  v_usec/864000000
204d0 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  00.0;.#endif..#i
204e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
204f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
20500 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
20510 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
20520 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
20530 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
20540 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
20550 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20560 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
20570 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20580 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
20590 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
205a0 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
205b0 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
205c0 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
205d0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
205e0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
205f0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
20600 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
20610 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
20620 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
20630 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
20640 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
20650 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
20660 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
20670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20680 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
20690 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
206a0 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
206b0 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
206c0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
206d0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
206e0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
206f0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
20700 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
20710 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
20720 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
20730 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
20740 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
20750 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
20760 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
20770 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../*.*********
20780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
20790 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
207a0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
207b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
207c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
207d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
207e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
207f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20810 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
20820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20860 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20880 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
20890 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
208a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
208c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
208d0 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
208e0 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
208f0 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
20900 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
20910 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
20920 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
20930 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
20940 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
20950 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
20960 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
20970 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
20980 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
20990 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
209a0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
209b0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
209c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
209d0 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
209e0 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
209f0 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
20a00 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
20a10 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
20a20 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
20a30 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
20a40 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
20a50 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
20a60 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
20a70 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
20a80 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
20a90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
20aa0 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
20ab0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
20ac0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
20ad0 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
20ae0 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
20af0 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
20b00 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
20b10 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
20b20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
20b30 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
20b40 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
20b50 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
20b60 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
20b70 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
20b80 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
20b90 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
20ba0 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
20bb0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
20bc0 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
20bd0 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
20be0 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
20bf0 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
20c00 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
20c10 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
20c20 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
20c30 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
20c40 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
20c50 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
20c60 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
20c70 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
20c80 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
20c90 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
20ca0 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
20cb0 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
20cc0 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
20cd0 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
20ce0 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
20cf0 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
20d00 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
20d10 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
20d20 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
20d30 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
20d40 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
20d50 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
20d60 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
20d70 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
20d80 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
20d90 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
20da0 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
20db0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
20dc0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
20dd0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
20de0 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
20df0 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
20e00 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
20e10 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
20e20 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
20e30 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
20e40 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
20e50 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
20e60 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
20e70 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
20e80 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
20e90 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
20ea0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
20eb0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
20ec0 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
20ed0 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
20ee0 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
20ef0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
20f00 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
20f10 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
20f20 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
20f30 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
20f40 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
20f50 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
20f60 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
20f70 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
20f80 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
20f90 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
20fa0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
20fb0 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
20fc0 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
20fd0 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
20fe0 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
20ff0 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
21000 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
21010 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
21020 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
21030 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
21040 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
21050 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
21060 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
21070 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
21080 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
21090 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
210a0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
210b0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
210c0 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
210d0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
210e0 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
210f0 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
21100 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
21110 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
21120 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
21130 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
21140 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
21150 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
21160 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
21170 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
21180 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
21190 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
211a0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
211b0 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
211c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
211d0 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
211e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
211f0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
21200 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
21210 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
21240 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
21250 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
21260 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
21270 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
21280 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
21290 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
212a0 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
212b0 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
212c0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
212d0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
212e0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
212f0 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
21300 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
21310 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
21320 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
21330 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
21340 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
21350 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
21360 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
21370 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
21380 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
21390 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
213a0 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
213b0 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
213c0 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
213d0 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
213e0 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
213f0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
21400 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
21410 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
21420 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
21430 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
21440 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
21450 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
21460 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
21470 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
21480 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
21490 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
214a0 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
214b0 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
214c0 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
214d0 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
214e0 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
214f0 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
21500 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
21510 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
21520 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
21530 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
21540 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
21550 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
21560 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
21570 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
21580 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
21590 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
215a0 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
215b0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
215c0 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
215d0 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
215e0 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
215f0 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
21600 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
21610 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
21620 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
21630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
21640 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
21650 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
21660 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
21670 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
21680 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
21690 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
216a0 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
216b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
216c0 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
216d0 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
216e0 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
216f0 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
21700 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
21710 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
21720 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
21730 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
21740 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
21750 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
21760 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
21770 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
21780 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
21790 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
217a0 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
217b0 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
217c0 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
217d0 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
217e0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
217f0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
21800 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
21810 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
21820 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
21830 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
21840 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
21850 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
21860 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
21870 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
21880 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
21890 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
218a0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
218b0 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
218c0 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
218d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
218e0 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
218f0 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
21900 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
21910 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
21920 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
21930 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
21940 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
21950 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
21960 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
21970 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
21980 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
21990 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
219a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
219b0 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
219c0 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
219d0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
219e0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
219f0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
21a00 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
21a10 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
21a20 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
21a30 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
21a40 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
21a50 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
21a60 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
21a70 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
21a80 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
21a90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
21aa0 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
21ab0 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
21ac0 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
21ad0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
21ae0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
21af0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
21b00 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
21b10 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
21b20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
21b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21b40 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
21b50 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
21b60 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
21b70 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
21b80 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
21b90 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
21ba0 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
21bb0 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le)..**.** There
21bc0 20 69 73 20 61 20 74 68 69 72 64 20 66 69 6c 65   is a third file
21bd0 20 2d 20 74 68 65 20 68 6f 73 74 20 49 44 20 66   - the host ID f
21be0 69 6c 65 20 2d 20 75 73 65 64 20 61 73 20 61 20  ile - used as a 
21bf0 70 65 72 73 69 73 74 65 6e 74 20 72 65 63 6f 72  persistent recor
21c00 64 0a 2a 2a 20 6f 66 20 61 20 75 6e 69 71 75 65  d.** of a unique
21c10 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
21c20 74 68 65 20 68 6f 73 74 2c 20 61 20 31 32 38 2d  the host, a 128-
21c30 62 79 74 65 20 75 6e 69 71 75 65 20 68 6f 73 74  byte unique host
21c40 20 69 64 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 74   id file.** in t
21c50 68 65 20 70 61 74 68 20 64 65 66 69 6e 65 64 20  he path defined 
21c60 62 79 20 74 68 65 20 48 4f 53 54 49 44 50 41 54  by the HOSTIDPAT
21c70 48 20 6d 61 63 72 6f 20 28 64 65 66 61 75 6c 74  H macro (default
21c80 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c 69   value is.** /Li
21c90 62 72 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f  brary/Caches/.co
21ca0 6d 2e 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f  m.apple.sqliteCo
21cb0 6e 63 68 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a  nchHostId)..**.*
21cc0 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65  * Requesting the
21cd0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73   lock proxy does
21ce0 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79   not immediately
21cf0 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c   take the conch,
21d00 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74   it is.** only t
21d10 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69  aken when the fi
21d20 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c  rst request to l
21d30 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ock database fil
21d40 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20  e is made.  .** 
21d50 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
21d60 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68   semantics of th
21d70 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f  e traditional lo
21d80 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20  cking behavior, 
21d90 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67  where.** opening
21da0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
21db0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
21dc0 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61   does not take a
21dd0 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20   lock on it..** 
21de0 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  The shared lock 
21df0 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  and an open file
21e00 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
21e10 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c  maintained until
21e20 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74   .** the connect
21e30 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
21e40 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a  ase is closed. .
21e50 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
21e60 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  file and the loc
21e70 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72  k file are never
21e80 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79   deleted so they
21e90 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f   only need.** to
21ea0 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20   be created the 
21eb0 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20  first time they 
21ec0 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  are used..**.** 
21ed0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  Configuration op
21ee0 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  tions.** -------
21ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
21f00 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45  *.**  SQLITE_PRE
21f10 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
21f20 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61  G.**.**       Da
21f30 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63  tabase files acc
21f40 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63  essed on non-loc
21f50 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20  al file systems 
21f60 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74  are.**       aut
21f70 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69  omatically confi
21f80 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20  gured for proxy 
21f90 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69  locking, lock fi
21fa0 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  les are.**      
21fb0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
21fc0 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73  ally using the s
21fd0 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20  ame logic as.** 
21fe0 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63        PRAGMA loc
21ff0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61  k_proxy_file=":a
22000 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20  uto:".**    .** 
22010 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
22020 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  BUG.**.**       
22030 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67  Enables the logg
22040 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73  ing of error mes
22050 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73  sages during hos
22060 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20  t id file.**    
22070 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64     retrieval and
22080 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20   creation.**.** 
22090 20 48 4f 53 54 49 44 50 41 54 48 0a 2a 2a 0a 2a   HOSTIDPATH.**.*
220a0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
220b0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 68 6f  s the default ho
220c0 73 74 20 49 44 20 66 69 6c 65 20 70 61 74 68 20  st ID file path 
220d0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  location.**.**  
220e0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
220f0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
22100 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
22110 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
22120 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
22130 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
22140 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
22150 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
22160 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
22170 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
22180 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
22190 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
221a0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
221b0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
221c0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
221d0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
221e0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
221f0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
22200 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
22210 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
22220 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
22230 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
22240 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
22250 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
22260 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
22270 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
22280 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
22290 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
222a0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
222b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
222c0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
222d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
222e0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
222f0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
22300 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
22310 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
22320 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
22330 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
22340 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
22350 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
22360 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67  xplicity calling
22370 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f   the SQLITE_SET_
22380 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
22390 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
223a0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
223b0 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
223c0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
223d0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
223e0 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
223f0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
22400 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
22410 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
22420 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
22430 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
22440 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22450 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22460 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
22470 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
22480 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
22490 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
224a0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
224b0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
224c0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
224d0 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
224e0 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
224f0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
22500 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
22510 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
22520 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
22530 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
22540 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
22550 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
22560 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
22570 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
22580 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
22590 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
225a0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
225b0 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
225c0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
225d0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
225e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
225f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
22600 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
22610 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
22620 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
22630 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
22640 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
22650 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
22660 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
22670 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
22680 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
226b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
226c0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
226d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
226e0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
226f0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a  currently held *
22700 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63  /.  void *oldLoc
22710 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
22720 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63   /* Original loc
22730 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72  kingcontext to r
22740 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20  estore on close 
22750 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  */.  sqlite3_io_
22760 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
22770 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f  OldMethod;     /
22780 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d  * Original I/O m
22790 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65  ethods for close
227a0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49   */.};../* HOSTI
227b0 44 4c 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45  DLEN and CONCHLE
227c0 4e 20 62 6f 74 68 20 69 6e 63 6c 75 64 65 20 73  N both include s
227d0 70 61 63 65 20 66 6f 72 20 74 68 65 20 73 74 72  pace for the str
227e0 69 6e 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74  ing .** terminat
227f0 69 6e 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66  ing nul .*/.#def
22800 69 6e 65 20 48 4f 53 54 49 44 4c 45 4e 20 20 20  ine HOSTIDLEN   
22810 20 20 20 20 20 20 31 32 38 0a 23 64 65 66 69 6e        128.#defin
22820 65 20 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20  e CONCHLEN      
22830 20 20 20 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b      (MAXPATHLEN+
22840 48 4f 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66  HOSTIDLEN+1).#if
22850 6e 64 65 66 20 48 4f 53 54 49 44 50 41 54 48 0a  ndef HOSTIDPATH.
22860 23 20 64 65 66 69 6e 65 20 48 4f 53 54 49 44 50  # define HOSTIDP
22870 41 54 48 20 20 20 20 20 20 20 22 2f 4c 69 62 72  ATH       "/Libr
22880 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e  ary/Caches/.com.
22890 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63  apple.sqliteConc
228a0 68 48 6f 73 74 49 64 22 0a 23 65 6e 64 69 66 0a  hHostId".#endif.
228b0 0a 2f 2a 20 62 61 73 69 63 61 6c 6c 79 20 61 20  ./* basically a 
228c0 63 6f 70 79 20 6f 66 20 75 6e 69 78 52 61 6e 64  copy of unixRand
228d0 6f 6d 6e 65 73 73 20 77 69 74 68 20 64 69 66 66  omness with diff
228e0 65 72 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65  erent.** test be
228f0 68 61 76 69 6f 72 20 62 75 69 6c 74 20 69 6e 20  havior built in 
22900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
22910 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49  oxyGenerateHostI
22920 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44 29  D(char *pHostID)
22930 7b 0a 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c  {.  int pid, fd,
22940 20 6c 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64   len;.  unsigned
22950 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e   char *key = (un
22960 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 48  signed char *)pH
22970 6f 73 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73  ostID;.  .  mems
22980 65 74 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49  et(key, 0, HOSTI
22990 44 4c 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30  DLEN);.  len = 0
229a0 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f  ;.  fd = open("/
229b0 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
229c0 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66  RDONLY);.  if( f
229d0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20  d>=0 ){.    len 
229e0 3d 20 72 65 61 64 28 66 64 2c 20 6b 65 79 2c 20  = read(fd, key, 
229f0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
22a00 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
22a10 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20  lently leak the 
22a20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a  fd if it fails *
22a30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20  /.  }.  if( len 
22a40 3c 20 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  < HOSTIDLEN ){. 
22a50 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
22a60 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d   time(&t);.    m
22a70 65 6d 63 70 79 28 6b 65 79 2c 20 26 74 2c 20 73  emcpy(key, &t, s
22a80 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 70  izeof(t));.    p
22a90 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
22aa0 20 20 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73     memcpy(&key[s
22ab0 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
22ac0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
22ad0 20 7d 0a 20 20 0a 23 69 66 64 65 66 20 4d 41 4b   }.  .#ifdef MAK
22ae0 45 5f 50 52 45 54 54 59 5f 48 4f 53 54 49 44 0a  E_PRETTY_HOSTID.
22af0 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
22b00 20 20 20 2f 2a 20 66 69 6c 74 65 72 20 74 68 65     /* filter the
22b10 20 62 79 74 65 73 20 69 6e 74 6f 20 70 72 69 6e   bytes into prin
22b20 74 61 62 6c 65 20 61 73 63 69 69 20 63 68 61 72  table ascii char
22b30 61 63 74 65 72 73 20 61 6e 64 20 4e 55 4c 20 74  acters and NUL t
22b40 65 72 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20  erminate */.    
22b50 6b 65 79 5b 28 48 4f 53 54 49 44 4c 45 4e 2d 31  key[(HOSTIDLEN-1
22b60 29 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 66  )] = 0x00;.    f
22b70 6f 72 28 20 69 3d 30 3b 20 69 3c 28 48 4f 53 54  or( i=0; i<(HOST
22b80 49 44 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b  IDLEN-1); i++ ){
22b90 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
22ba0 63 68 61 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d  char pa = key[i]
22bb0 26 30 78 37 46 3b 0a 20 20 20 20 20 20 69 66 28  &0x7F;.      if(
22bc0 20 70 61 3c 30 78 32 30 20 29 7b 0a 20 20 20 20   pa<0x20 ){.    
22bd0 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65      key[i] = (ke
22be0 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38  y[i]&0x80 == 0x8
22bf0 30 29 20 3f 20 70 61 2b 30 78 34 30 20 3a 20 70  0) ? pa+0x40 : p
22c00 61 2b 30 78 32 30 3b 0a 20 20 20 20 20 20 7d 65  a+0x20;.      }e
22c10 6c 73 65 20 69 66 28 20 70 61 3d 3d 30 78 37 46  lse if( pa==0x7F
22c20 20 29 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b   ){.        key[
22c30 69 5d 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38  i] = (key[i]&0x8
22c40 30 20 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 3d  0 == 0x80) ? pa=
22c50 30 78 32 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a  0x20 : pa+0x7E;.
22c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22c70 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
22c80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22c90 2f 2a 20 77 72 69 74 65 73 20 74 68 65 20 68 6f  /* writes the ho
22ca0 73 74 20 69 64 20 70 61 74 68 20 74 6f 20 70 61  st id path to pa
22cb0 74 68 2c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  th, path should 
22cc0 62 65 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61  be an pre-alloca
22cd0 74 65 64 20 62 75 66 66 65 72 0a 2a 2a 20 77 69  ted buffer.** wi
22ce0 74 68 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  th enough space 
22cf0 66 6f 72 20 61 20 70 61 74 68 20 0a 2a 2f 0a 73  for a path .*/.s
22d00 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 78 79  tatic void proxy
22d10 47 65 74 48 6f 73 74 49 44 50 61 74 68 28 63 68  GetHostIDPath(ch
22d20 61 72 20 2a 70 61 74 68 2c 20 73 69 7a 65 5f 74  ar *path, size_t
22d30 20 6c 65 6e 29 7b 0a 20 20 73 74 72 6c 63 70 79   len){.  strlcpy
22d40 28 70 61 74 68 2c 20 48 4f 53 54 49 44 50 41 54  (path, HOSTIDPAT
22d50 48 2c 20 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20  H, len);.#ifdef 
22d60 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
22d70 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
22d80 5f 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 63 68  _num>0 ){.    ch
22d90 61 72 20 73 75 66 66 69 78 5b 32 5d 20 3d 20 22  ar suffix[2] = "
22da0 31 22 3b 0a 20 20 20 20 73 75 66 66 69 78 5b 30  1";.    suffix[0
22db0 5d 20 3d 20 73 75 66 66 69 78 5b 30 5d 20 2b 20  ] = suffix[0] + 
22dc0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
22dd0 75 6d 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28  um;.    strlcat(
22de0 70 61 74 68 2c 20 73 75 66 66 69 78 2c 20 6c 65  path, suffix, le
22df0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  n);.  }.#endif. 
22e00 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48 4f   OSTRACE3("GETHO
22e10 53 54 49 44 50 41 54 48 20 20 25 73 20 70 69 64  STIDPATH  %s pid
22e20 3d 25 64 5c 6e 22 2c 20 70 61 74 68 2c 20 67 65  =%d\n", path, ge
22e30 74 70 69 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67  tpid());.}../* g
22e40 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 66  et the host ID f
22e50 72 6f 6d 20 61 20 73 71 6c 69 74 65 20 68 6f 73  rom a sqlite hos
22e60 74 69 64 20 66 69 6c 65 20 73 74 6f 72 65 64 20  tid file stored 
22e70 69 6e 20 74 68 65 20 0a 2a 2a 20 75 73 65 72 2d  in the .** user-
22e80 73 70 65 63 69 66 69 63 20 74 6d 70 20 64 69 72  specific tmp dir
22e90 65 63 74 6f 72 79 2c 20 63 72 65 61 74 65 20 74  ectory, create t
22ea0 68 65 20 49 44 20 69 66 20 69 74 27 73 20 6e 6f  he ID if it's no
22eb0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  t there already 
22ec0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
22ed0 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 63 68  roxyGetHostID(ch
22ee0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
22ef0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e 74   *pError){.  int
22f00 20 66 64 3b 0a 20 20 63 68 61 72 20 70 61 74 68   fd;.  char path
22f10 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a 20  [MAXPATHLEN]; . 
22f20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20 69   size_t len;.  i
22f30 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b  nt rc=SQLITE_OK;
22f40 0a 0a 20 20 70 72 6f 78 79 47 65 74 48 6f 73 74  ..  proxyGetHost
22f50 49 44 50 61 74 68 28 70 61 74 68 2c 20 4d 41 58  IDPath(path, MAX
22f60 50 41 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74  PATHLEN);.  /* t
22f70 72 79 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ry to create the
22f80 20 68 6f 73 74 20 49 44 20 66 69 6c 65 2c 20 69   host ID file, i
22f90 66 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  f it already exi
22fa0 73 74 73 20 72 65 61 64 20 74 68 65 20 63 6f 6e  sts read the con
22fb0 74 65 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20  tents */.  fd = 
22fc0 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45  open(path, O_CRE
22fd0 41 54 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58  AT|O_WRONLY|O_EX
22fe0 43 4c 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28  CL, 0644);.  if(
22ff0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   fd<0 ){.    int
23000 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20   err=errno;.... 
23010 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
23020 53 54 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ST ){.#ifdef SQL
23030 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20  ITE_PROXY_DEBUG 
23040 2f 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74  /* set the sqlit
23050 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
23060 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20  instead */.     
23070 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
23080 20 22 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63   "sqlite error c
23090 72 65 61 74 69 6e 67 20 68 6f 73 74 20 49 44 20  reating host ID 
230a0 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a  file %s: %s\n",.
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
230c0 74 68 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  th, strerror(err
230d0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
230e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
230f0 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ERM;.    }.    /
23100 2a 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  * couldn't creat
23110 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 61 64  e the file, read
23120 20 69 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20   it instead */. 
23130 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
23140 68 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58  h, O_RDONLY|O_EX
23150 43 4c 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  CL);.    if( fd<
23160 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
23170 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f  TE_PROXY_DEBUG /
23180 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
23190 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
231a0 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20  nstead */.      
231b0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
231c0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
231d0 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65  tderr, "sqlite e
231e0 72 72 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73  rror opening hos
231f0 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73  t ID file %s: %s
23200 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23210 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f     path, strerro
23220 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a  r(err));.#endif.
23230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23240 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a  ITE_PERM;.    }.
23250 20 20 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28      len = pread(
23260 66 64 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53  fd, pHostID, HOS
23270 54 49 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  TIDLEN, 0);.    
23280 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
23290 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
232a0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
232b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
232c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
232d0 6c 65 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b  len<HOSTIDLEN ){
232e0 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  .      *pError =
232f0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   0;.      rc = S
23300 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
23310 54 5f 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20  T_READ;.    }.  
23320 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
23330 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68  silently leak th
23340 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73  e fd if it fails
23350 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33   */.    OSTRACE3
23360 28 22 47 45 54 48 4f 53 54 49 44 20 20 72 65 61  ("GETHOSTID  rea
23370 64 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  d %s pid=%d\n", 
23380 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69 64 28  pHostID, getpid(
23390 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
233a0 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
233b0 2f 2a 20 77 65 27 72 65 20 63 72 65 61 74 69 6e  /* we're creatin
233c0 67 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69  g the host ID fi
233d0 6c 65 20 28 75 73 65 20 61 20 72 61 6e 64 6f 6d  le (use a random
233e0 20 73 74 72 69 6e 67 20 6f 66 20 62 79 74 65 73   string of bytes
233f0 29 20 2a 2f 0a 20 20 20 20 70 72 6f 78 79 47 65  ) */.    proxyGe
23400 6e 65 72 61 74 65 48 6f 73 74 49 44 28 70 48 6f  nerateHostID(pHo
23410 73 74 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  stID);.    len =
23420 20 70 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73   pwrite(fd, pHos
23430 74 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20  tID, HOSTIDLEN, 
23440 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c  0);.    if( len<
23450 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  0 ){.      *pErr
23460 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  or = errno;.    
23470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23480 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
23490 65 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53  else if( len<HOS
234a0 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  TIDLEN ){.      
234b0 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20  *pError = 0;.   
234c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
234d0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
234e0 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b  }.    close(fd);
234f0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
23500 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66  k the fd if it f
23510 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52  ails */.    OSTR
23520 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44 20  ACE3("GETHOSTID 
23530 20 77 72 6f 74 65 20 25 73 20 70 69 64 3d 25 64   wrote %s pid=%d
23540 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65  \n", pHostID, ge
23550 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74  tpid());.    ret
23560 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73  urn rc;.  }.}..s
23570 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
23580 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
23590 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
235a0 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
235b0 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
235c0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
235d0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
235e0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
235f0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
23600 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
23610 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
23620 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
23630 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
23640 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 63  MP_DIR.  {.    c
23650 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
23660 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
23670 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b   lPath, maxLen);
23680 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
23690 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
236a0 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
236b0 29 3b 0a 20 20 20 20 69 66 28 20 6d 6b 64 69 72  );.    if( mkdir
236c0 28 6c 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 44  (lPath, SQLITE_D
236d0 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
236e0 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
236f0 20 20 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69        /* if mkdi
23700 72 20 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20  r fails, handle 
23710 61 73 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65  as lock file cre
23720 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ation failure */
23730 0a 23 20 20 69 66 64 65 66 20 53 51 4c 49 54 45  .#  ifdef SQLITE
23740 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 6e 74  _DEBUG.      int
23750 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
23760 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
23770 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66  IST ){.        f
23780 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23790 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
237a0 3a 20 6d 6b 64 69 72 28 25 73 2c 30 25 6f 29 20  : mkdir(%s,0%o) 
237b0 65 72 72 6f 72 20 25 64 20 25 73 5c 6e 22 2c 20  error %d %s\n", 
237c0 6c 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20  lPath,.         
237d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
237e0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
237f0 45 52 4d 49 53 53 49 4f 4e 53 2c 20 65 72 72 2c  ERMISSIONS, err,
23800 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b   strerror(err));
23810 0a 20 20 20 20 20 20 7d 0a 23 20 20 65 6e 64 69  .      }.#  endi
23820 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
23830 20 20 20 4f 53 54 52 41 43 45 33 28 22 47 45 54     OSTRACE3("GET
23840 4c 4f 43 4b 50 41 54 48 20 20 6d 6b 64 69 72 20  LOCKPATH  mkdir 
23850 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
23860 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ath, getpid());.
23870 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 7d 0a 23      }.    .  }.#
23880 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
23890 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
238a0 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
238b0 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
238c0 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
238d0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
238e0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
238f0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
23900 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
23910 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
23920 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
23930 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
23940 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
23950 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
23960 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
23970 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78  && (i+len+7)<max
23980 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
23990 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
239a0 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
239b0 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
239c0 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
239d0 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
239e0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
239f0 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
23a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23a10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23a20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
23a30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23a40 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
23a50 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
23a60 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
23a70 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
23a80 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
23a90 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
23aa0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
23ab0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
23ac0 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
23ad0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
23ae0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23af0 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
23b00 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
23b10 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
23b20 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
23b30 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
23b40 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
23b50 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 63 6f  reateUnixFile(co
23b60 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
23b70 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
23b80 65 29 20 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  e) {.  int fd;. 
23b90 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
23ba0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
23bb0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
23bc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
23bd0 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b  e3_vfs dummyVfs;
23be0 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61  ..  fd = open(pa
23bf0 74 68 2c 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  th, O_RDWR | O_C
23c00 52 45 41 54 2c 20 53 51 4c 49 54 45 5f 44 45 46  REAT, SQLITE_DEF
23c10 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
23c20 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64  SIONS);.  if( fd
23c30 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
23c40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23c50 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  ;.  }.  .  pNew 
23c60 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
23c70 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
23c80 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
23c90 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
23ca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
23cb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
23cc0 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
23cd0 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
23ce0 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
23cf0 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
23d00 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
23d10 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
23d20 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
23d30 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
23d40 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
23d50 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
23d60 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
23d70 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20   path, 0, 0);.  
23d80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23d90 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
23da0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
23db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23dc0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
23dd0 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65  oxy:    .  close
23de0 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
23df0 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72  y leak fd if err
23e00 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64  or, we're alread
23e10 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
23e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
23e30 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
23e40 0a 7d 0a 0a 2f 2a 20 74 61 6b 65 73 20 74 68 65  .}../* takes the
23e50 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67   conch by taking
23e60 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
23e70 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  nd read the cont
23e80 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a  ents conch, if .
23e90 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e  ** lockPath is n
23ea0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73  on-NULL, the hos
23eb0 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t ID and lock fi
23ec0 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74  le path must mat
23ed0 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20  ch.  A NULL .** 
23ee0 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74  lockPath means t
23ef0 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68  hat the lockPath
23f00 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
23f10 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
23f20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
23f30 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20  IDs match, or a 
23f40 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  new lock path wi
23f50 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
23f60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
23f70 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f  * and written to
23f80 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e   the conch file.
23f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
23fa0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e  roxyTakeConch(un
23fb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
23fc0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
23fd0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
23fe0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
23ff0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
24000 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a  ingContext; .  .
24010 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
24020 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72  hHeld>0 ){.    r
24030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
24050 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
24060 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
24070 69 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 74 65  ile;.    char te
24080 73 74 56 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e  stValue[CONCHLEN
24090 5d 3b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 63  ];.    char conc
240a0 68 56 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d  hValue[CONCHLEN]
240b0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
240c0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
240d0 0a 20 20 20 20 63 68 61 72 20 2a 74 4c 6f 63 6b  .    char *tLock
240e0 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
240f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24100 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  _OK;.    int rea
24110 64 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  dRc = SQLITE_OK;
24120 0a 20 20 20 20 69 6e 74 20 73 79 6e 63 50 65 72  .    int syncPer
24130 6d 73 20 3d 20 30 3b 0a 0a 20 20 20 20 4f 53 54  ms = 0;..    OST
24140 52 41 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48  RACE4("TAKECONCH
24150 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
24160 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
24170 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
24180 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
24190 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
241a0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
241b0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
241c0 28 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 63  ());..    rc = c
241d0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
241e0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
241f0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
24200 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
24210 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24230 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
24240 20 20 20 20 20 20 6d 65 6d 73 65 74 28 74 65 73        memset(tes
24250 74 56 61 6c 75 65 2c 20 30 2c 20 43 4f 4e 43 48  tValue, 0, CONCH
24260 4c 45 4e 29 3b 20 2f 2a 20 63 6f 6e 63 68 20 69  LEN); /* conch i
24270 73 20 66 69 78 65 64 20 73 69 7a 65 20 2a 2f 0a  s fixed size */.
24280 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
24290 47 65 74 48 6f 73 74 49 44 28 74 65 73 74 56 61  GetHostID(testVa
242a0 6c 75 65 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  lue, &pError);. 
242b0 20 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66       if( (rc&0xf
242c0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
242d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
242e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
242f0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Error;.      }. 
24300 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
24310 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
24320 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
24330 26 74 65 73 74 56 61 6c 75 65 5b 48 4f 53 54 49  &testValue[HOSTI
24340 44 4c 45 4e 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63  DLEN], pCtx->loc
24350 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50  kProxyPath, MAXP
24360 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 7d  ATHLEN);.      }
24370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24390 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
243a0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
243b0 20 20 20 20 0a 20 20 20 20 72 65 61 64 52 63 20      .    readRc 
243c0 3d 20 75 6e 69 78 52 65 61 64 28 28 73 71 6c 69  = unixRead((sqli
243d0 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68  te3_file *)conch
243e0 46 69 6c 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65  File, conchValue
243f0 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  , CONCHLEN, 0);.
24400 20 20 20 20 69 66 28 20 72 65 61 64 52 63 21 3d      if( readRc!=
24410 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
24420 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
24430 20 69 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c   if( readRc!=SQL
24440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24450 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
24460 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
24470 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
24480 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
24490 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
244a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
244b0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 52        rc = readR
244c0 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  c;.        goto 
244d0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
244e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
244f0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
24500 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
24510 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
24520 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
24530 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
24540 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
24550 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
24560 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
24570 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
24580 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
24590 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20       ** use the 
245a0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
245b0 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65  path that's alre
245c0 61 64 79 20 69 6e 20 74 68 65 72 65 20 2a 2f 0a  ady in there */.
245d0 20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d          if( !mem
245e0 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63  cmp(testValue, c
245f0 6f 6e 63 68 56 61 6c 75 65 2c 20 48 4f 53 54 49  onchValue, HOSTI
24600 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
24610 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 28     tLockPath = (
24620 63 68 61 72 20 2a 29 26 63 6f 6e 63 68 56 61 6c  char *)&conchVal
24630 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a 20  ue[HOSTIDLEN];. 
24640 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24650 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
24660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24670 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77  se{.        /* w
24680 65 27 76 65 20 67 6f 74 20 74 68 65 20 63 6f 6e  e've got the con
24690 63 68 20 69 66 20 63 6f 6e 63 68 56 61 6c 75 65  ch if conchValue
246a0 20 6d 61 74 63 68 65 73 20 6f 75 72 20 70 61 74   matches our pat
246b0 68 20 61 6e 64 20 68 6f 73 74 20 49 44 20 2a 2f  h and host ID */
246c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65  .        if( !me
246d0 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20  mcmp(testValue, 
246e0 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e 43  conchValue, CONC
246f0 48 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  HLEN) ){.       
24700 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
24710 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 7d  conch;.        }
24720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
24730 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73  se{.      /* a s
24740 68 6f 72 74 20 72 65 61 64 20 6d 65 61 6e 73 20  hort read means 
24750 77 65 27 72 65 20 22 63 72 65 61 74 69 6e 67 22  we're "creating"
24760 20 74 68 65 20 63 6f 6e 63 68 20 28 65 76 65 6e   the conch (even
24770 20 74 68 6f 75 67 68 20 69 74 20 63 6f 75 6c 64   though it could
24780 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20   .      ** have 
24790 62 65 65 6e 20 75 73 65 72 2d 69 6e 74 65 72 76  been user-interv
247a0 65 6e 74 69 6f 6e 29 2c 20 69 66 20 77 65 20 61  ention), if we a
247b0 63 71 75 69 72 65 20 74 68 65 20 65 78 63 6c 75  cquire the exclu
247c0 73 69 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20 20  sive lock,.     
247d0 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
247e0 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65   match the curre
247f0 6e 74 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d 69  nt on-disk permi
24800 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61  ssions of the da
24810 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2f 0a  tabase.      */.
24820 20 20 20 20 20 20 73 79 6e 63 50 65 72 6d 73 20        syncPerms 
24830 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  = 1;.    }.    .
24840 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 63 6f      /* either co
24850 6e 63 68 20 77 61 73 20 65 6d 74 70 79 20 6f 72  nch was emtpy or
24860 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 2a 2f   didn't match */
24870 0a 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e  .    if( !pCtx->
24880 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
24890 0a 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c  .      proxyGetL
248a0 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
248b0 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
248c0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
248d0 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 6c     tLockPath = l
248e0 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 73  ockPath;.      s
248f0 74 72 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75  trlcpy(&testValu
24900 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f  e[HOSTIDLEN], lo
24910 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
24920 45 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  EN);.    }.    .
24930 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
24940 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
24950 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
24960 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
24970 70 72 6f 63 65 73 73 0a 20 20 20 20 20 2a 2a 20  process.     ** 
24980 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
24990 6b 20 61 6c 72 65 61 64 79 29 20 2a 2f 0a 20 20  k already) */.  
249a0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
249b0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
249c0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
249d0 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55  conchFile, EXCLU
249e0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
249f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24a00 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
24a10 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
24a20 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
24a30 69 6c 65 2c 20 74 65 73 74 56 61 6c 75 65 2c 20  ile, testValue, 
24a40 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
24a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24a60 54 45 5f 4f 4b 20 26 26 20 73 79 6e 63 50 65 72  TE_OK && syncPer
24a70 6d 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ms ){.        st
24a80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
24a90 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
24aa0 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c   fstat(pFile->h,
24ab0 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20   &buf);.        
24ac0 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20  if( err==0 ){.  
24ad0 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
24ae0 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
24af0 62 61 73 65 20 66 69 6c 65 20 70 65 72 6d 69 73  base file permis
24b00 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
24b10 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
24b20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
24b30 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 66 63  BUG.          fc
24b40 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
24b50 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b  h, buf.st_mode);
24b60 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
24b70 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63   if( fchmod(conc
24b80 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  hFile->h, buf.st
24b90 5f 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20  _mode)!=0 ){.   
24ba0 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
24bb0 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
24bc0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
24bd0 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
24be0 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
24bf0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 62 75 66 2e 73 74 5f 6d 6f 64 65       buf.st_mode
24c20 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
24c30 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20  (code));.       
24c40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
24c50 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
24c60 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
24c70 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 62  %o SUCCEDED\n",b
24c80 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20  uf.st_mode);.   
24c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24cb0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
24cc0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  no;.          fp
24cd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
24ce0 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
24cf0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f           err, co
24d20 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
24d30 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e));.#endif.    
24d40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24d50 20 20 7d 0a 20 20 20 20 63 6f 6e 63 68 46 69 6c    }.    conchFil
24d60 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
24d70 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
24d80 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
24d90 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65  ARED_LOCK);.  .e
24da0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20  nd_takeconch:.  
24db0 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e    OSTRACE2("TRAN
24dc0 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
24dd0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
24de0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24df0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
24e00 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20  >openFlags ){.  
24e10 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68      if( pFile->h
24e20 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54  >=0 ){.#ifdef ST
24e30 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52  RICT_CLOSE_ERROR
24e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f  .        if( clo
24e50 73 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a  se(pFile->h) ){.
24e60 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
24e70 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
24e80 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
24e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
24ea0 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20  R_CLOSE;.       
24eb0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
24ec0 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29   close(pFile->h)
24ed0 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
24ee0 61 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f  ak fd if fail */
24ef0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
24f00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
24f10 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 66   -1;.      int f
24f20 64 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64  d = open(pCtx->d
24f30 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70  bPath, pFile->op
24f40 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
24f60 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
24f70 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
24f80 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 54       OSTRACE2("T
24f90 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20  RANSPROXY: OPEN 
24fa0 20 25 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20   %d\n", fd);.   
24fb0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
24fc0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
24fd0 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 7d 65 6c   = fd;.      }el
24fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 3d 53  se{.        rc=S
24ff0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
25000 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  /* SQLITE_BUSY? 
25010 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
25020 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  alled.          
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b       during lock
25050 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ing */.      }. 
25060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
25070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
25080 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29  Ctx->lockProxy )
25090 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 61  {.      char *pa
250a0 74 68 20 3d 20 74 4c 6f 63 6b 50 61 74 68 20 3f  th = tLockPath ?
250b0 20 74 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74   tLockPath : pCt
250c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
250d0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 43 53 3a 20  ;.      /* ACS: 
250e0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63  Need to make a c
250f0 6f 70 79 20 6f 66 20 70 61 74 68 20 73 6f 6d 65  opy of path some
25100 74 69 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 72  times */.      r
25110 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
25120 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
25130 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b  Ctx->lockProxy);
25140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25160 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
25170 68 48 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20  hHeld = 1;..    
25180 20 20 69 66 28 20 74 4c 6f 63 6b 50 61 74 68 20    if( tLockPath 
25190 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
251a0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
251b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
251c0 28 30 2c 20 74 4c 6f 63 6b 50 61 74 68 29 3b 0a  (0, tLockPath);.
251d0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
251e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
251f0 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
25200 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
25210 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43     ((afpLockingC
25220 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c  ontext *)pCtx->l
25230 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e  ockProxy->lockin
25240 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
25250 68 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  h =.            
25260 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
25270 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
25280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25290 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
252a0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
252b0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
252c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
252d0 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
252e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54  );.    }.    OST
252f0 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e 43 48  RACE3("TAKECONCH
25300 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
25310 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51  hFile->h, rc==SQ
25320 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61  LITE_OK?"ok":"fa
25330 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
25340 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
25350 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
25360 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
25370 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
25380 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
25390 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
253a0 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
253b0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
253c0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  le){.  int rc;  
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
253f0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
25400 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
25410 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
25420 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
25430 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
25440 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
25450 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
25460 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
25470 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
25480 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
25490 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
254a0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
254b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
254c0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
254d0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
254e0 53 54 52 41 43 45 34 28 22 52 45 4c 45 41 53 45  STRACE4("RELEASE
254f0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
25500 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
25510 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
25520 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
25530 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
25540 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
25550 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
25560 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
25570 29 29 3b 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ));.  pCtx->conc
25580 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 72 63 20  hHeld = 0;.  rc 
25590 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
255a0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
255b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
255c0 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
255d0 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52 45  ;.  OSTRACE3("RE
255e0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
255f0 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
25600 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
25610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
25620 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
25630 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25640 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
25650 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
25660 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70  abase file, comp
25670 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ute the name of 
25680 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  its conch file..
25690 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e  ** Store the con
256a0 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d  ch filename in m
256b0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
256c0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
256d0 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70  oc()..** Make *p
256e0 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20  ConchPath point 
256f0 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e  to the new name.
25700 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
25710 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
25720 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
25730 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62   if unable to ob
25740 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  tain memory..**.
25750 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
25760 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
25770 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
25780 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
25790 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20  ory.** space is 
257a0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
257b0 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50  ..**.** *pConchP
257c0 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ath is set to NU
257d0 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  LL if a memory a
257e0 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
257f0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
25800 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
25810 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63  eConchPathname(c
25820 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
25830 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b  r **pConchPath){
25840 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25870 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20   */.  int len = 
25880 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
25890 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  th); /* Length o
258a0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  f database filen
258b0 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a  ame - dbPath */.
258c0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74    char *conchPat
258d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
258e0 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69  /* buffer in whi
258f0 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
25900 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20  conch name */.. 
25910 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
25920 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  ce for the conch
25930 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e   filename and in
25940 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d  itialize the nam
25950 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61  e to.  ** the na
25960 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  me of the origin
25970 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
25980 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68  . */  .  *pConch
25990 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68  Path = conchPath
259a0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
259b0 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20  e3_malloc(len + 
259c0 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50  8);.  if( conchP
259d0 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ath==0 ){.    re
259e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
259f0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
25a00 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74  conchPath, dbPat
25a10 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20  h, len+1);.  .  
25a20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20  /* now insert a 
25a30 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c  "." before the l
25a40 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20  ast / character 
25a50 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e  */.  for( i=(len
25a60 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29  -1); i>=0; i-- )
25a70 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50  {.    if( conchP
25a80 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ath[i]=='/' ){. 
25a90 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
25aa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
25ab0 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d  .  conchPath[i]=
25ac0 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69  '.';.  while ( i
25ad0 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63  <len ){.    conc
25ae0 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74  hPath[i+1]=dbPat
25af0 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  h[i];.    i++;. 
25b00 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20   }..  /* append 
25b10 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66  the "-conch" suf
25b20 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fix to the file 
25b30 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e  */.  memcpy(&con
25b40 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63  chPath[i+1], "-c
25b50 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73  onch", 7);.  ass
25b60 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
25b70 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c  (conchPath) == l
25b80 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72  en+7 );..  retur
25b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25ba0 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c  ./* Takes a full
25bb0 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f  y configured pro
25bc0 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65  xy locking-style
25bd0 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73   unix file and s
25be0 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c  witches.** the l
25bf0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
25c00 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath .*/.static i
25c10 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f  nt switchLockPro
25c20 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20  xyPath(unixFile 
25c30 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
25c40 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
25c50 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
25c60 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
25c70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
25c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
25c90 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f  ntext;.  char *o
25ca0 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c  ldPath = pCtx->l
25cb0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
25cc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25cd0 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65  OK;..  if( pFile
25ce0 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
25cf0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
25d00 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
25d10 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69   }  ..  /* nothi
25d20 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20  ng to do if the 
25d30 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61  path is NULL, :a
25d40 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20  uto: or matches 
25d50 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74  the existing pat
25d60 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68  h */.  if( !path
25d70 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
25d80 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
25d90 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a  h, ":auto:") ||.
25da0 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20      (oldPath && 
25db0 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68  !strncmp(oldPath
25dc0 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  , path, MAXPATHL
25dd0 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  EN)) ){.    retu
25de0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25df0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
25e00 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
25e10 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
25e20 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
25e30 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20  Proxy=NULL;.    
25e40 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
25e50 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  = 0;.    if( loc
25e60 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a  kProxy!=NULL ){.
25e70 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f        rc=lockPro
25e80 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
25e90 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
25ea0 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  e *)lockProxy);.
25eb0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
25ec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25ed0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
25ee0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20  kProxy);.    }. 
25ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25f00 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43  oldPath);.    pC
25f10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
25f20 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
25f30 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20  Dup(0, path);.  
25f40 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
25f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65  ;.}../*.** pFile
25f60 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20   is a file that 
25f70 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
25f80 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e  by a prior xOpen
25f90 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a   call.  dbPath.*
25fa0 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75  * is a string bu
25fb0 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41  ffer at least MA
25fc0 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61  XPATHLEN+1 chara
25fd0 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  cters in size..*
25fe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25ff0 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e  e find the filen
26000 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ame associated w
26010 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72  ith pFile and wr
26020 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64  ites it.** int d
26030 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  bPath..*/.static
26040 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50   int proxyGetDbP
26050 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
26060 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
26070 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23  char *dbPath){.#
26080 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
26090 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c  LE__).  if( pFil
260a0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  e->pMethod == &a
260b0 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
260c0 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20     /* afp style 
260d0 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63  keeps a referenc
260e0 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68  e to the db path
260f0 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68   in the filePath
26100 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f   field .    ** o
26110 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a  f the struct */.
26120 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74      assert( (int
26130 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70  )strlen((char*)p
26140 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
26150 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
26160 4e 20 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28  N );.    strcpy(
26170 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
26180 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
26190 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
261a0 65 78 74 29 2d 3e 64 62 50 61 74 68 29 3b 0a 20  ext)->dbPath);. 
261b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
261c0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
261d0 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
261e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
261f0 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
26200 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
26210 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
26220 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
26230 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
26240 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
26250 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
26260 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
26270 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
26280 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
26290 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
262a0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
262b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
262c0 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
262d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
262e0 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
262f0 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
26300 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
26310 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
26320 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26330 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
26340 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
26350 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
26360 20 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64   );.    strcpy(d
26370 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
26380 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
26390 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  text);.  }.  ret
263a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
263b0 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ../*.** Takes an
263c0 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20   already filled 
263d0 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  in unix file and
263e0 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c   alters it so al
263f0 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a  l file locking .
26400 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f  ** will be perfo
26410 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61  rmed on the loca
26420 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  l proxy lock fil
26430 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
26440 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20  g fields.** are 
26450 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65  preserved in the
26460 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
26470 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
26480 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  n be restored an
26490 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73  d .** the unix s
264a0 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c  tructure properl
264b0 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20  y cleaned up at 
264c0 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20  close time:.**  
264d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
264e0 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a  .**  ->pMethod.*
264f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
26500 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
26510 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
26520 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
26530 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
26540 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
26550 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50  pCtx;.  char dbP
26560 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ath[MAXPATHLEN+1
26570 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ];       /* Name
26580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
26590 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
265a0 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a  *lockPath=NULL;.
265b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
265c0 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70  E_OK;.  .  if( p
265d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
265e0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
265f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
26600 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65  Y;.  }.  proxyGe
26610 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
26620 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68  le(pFile, dbPath
26630 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  );.  if( !path |
26640 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
26650 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
26660 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20   ":auto:") ){.  
26670 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b    lockPath=NULL;
26680 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
26690 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70  ckPath=(char *)p
266a0 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53  ath;.  }.  .  OS
266b0 54 52 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f  TRACE4("TRANSPRO
266c0 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  XY  %d for %s pi
266d0 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
266e0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  h,.           (l
266f0 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61  ockPath ? lockPa
26700 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
26710 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43  getpid());..  pC
26720 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
26730 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
26740 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78  x) );.  if( pCtx
26750 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
26760 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26770 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74    }.  memset(pCt
26780 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  x, 0, sizeof(*pC
26790 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  tx));..  rc = pr
267a0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
267b0 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26  thname(dbPath, &
267c0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
267d0 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ath);.  if( rc==
267e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
267f0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
26800 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e  eUnixFile(pCtx->
26810 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
26820 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
26830 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  ;.  }  .  if( rc
26840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
26850 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
26860 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
26870 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
26880 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
26890 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
268a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
268b0 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79     /* all memory
268c0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70   is allocated, p
268d0 72 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65  roxys are create
268e0 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20  d and assigned, 
268f0 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74  .    ** switch t
26900 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
26910 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
26920 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20  hen return..    
26930 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50  */.    pCtx->dbP
26940 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
26950 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29  trDup(0, dbPath)
26960 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c  ;.    pCtx->oldL
26970 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
26980 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
26990 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
269a0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
269b0 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74   = pCtx;.    pCt
269c0 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20  x->pOldMethod = 
269d0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a  pFile->pMethod;.
269e0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
269f0 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  od = &proxyIoMet
26a00 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
26a10 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
26a20 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20  chFile ){ .     
26a30 20 72 63 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63   rc = pCtx->conc
26a40 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
26a50 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
26a60 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e  file *)pCtx->con
26a70 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  chFile);.      i
26a80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
26a90 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
26aa0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
26ab0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
26ac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26ad0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
26ae0 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
26af0 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
26b00 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 52  }.  OSTRACE3("TR
26b10 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
26b20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
26b30 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
26b40 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
26b50 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
26b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
26b70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26b80 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33   handles sqlite3
26b90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
26ba0 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73  calls that are s
26bb0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72  pecific.** to pr
26bc0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  oxy locking..*/.
26bd0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
26be0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
26bf0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
26c00 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
26c10 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
26c20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
26c30 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
26c40 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
26c50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
26c60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
26c70 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
26c80 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
26c90 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
26ca0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
26cb0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
26cc0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
26cd0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
26ce0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
26cf0 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
26d00 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
26d10 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
26d20 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
26d30 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
26d40 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
26d50 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
26d60 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
26d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26d80 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
26d90 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
26da0 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
26db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
26dc0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
26dd0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
26de0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
26df0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
26e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26e10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
26e20 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
26e30 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
26e40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
26e50 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
26e60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26e70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
26e80 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
26e90 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
26ea0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
26eb0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
26ec0 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
26ed0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
26ee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
26ef0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
26f00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
26f10 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
26f20 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
26f30 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
26f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26f50 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
26f60 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
26f70 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
26f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f90 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
26fa0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
26fb0 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
26fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
26fd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
26ff0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
27000 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
27010 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
27020 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
27030 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
27040 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
27050 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
27060 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
27070 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
27080 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
27090 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
270a0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
270b0 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
270c0 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
270d0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
270e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
270f0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
27100 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
27110 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
27120 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
27130 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
27140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27160 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27170 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
27180 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
27190 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
271a0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
271b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
271c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
271d0 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
271e0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
271f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
27200 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
27210 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78  File(pFile, prox
27220 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
27230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27250 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
27270 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20  );  /* The call 
27280 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c  assures that onl
27290 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20  y valid opcodes 
272a0 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20  are sent */.    
272b0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
272c0 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20  CHED*/.  return 
272d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
272e0 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  ./*.** Within th
272f0 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65  is division (the
27300 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
27310 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
27320 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  ) the procedures
27330 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70  .** above this p
27340 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69  oint are all uti
27350 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63  lities.  The loc
27360 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64  k-related method
27370 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78  s of the.** prox
27380 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  y-locking sqlite
27390 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65  3_io_method obje
273a0 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a  ct follow..*/...
273b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
273c0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
273d0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
273e0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
273f0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
27400 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
27410 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
27420 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
27430 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
27440 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
27450 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
27460 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
27470 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
27480 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
27490 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
274a0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
274b0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
274c0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
274d0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
274e0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
274f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
27500 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
27510 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
27520 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
27530 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
27540 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
27550 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
27560 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
27570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27580 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
27590 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
275a0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
275b0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
275c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
275d0 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
275e0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
275f0 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 72  y;.    return pr
27600 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
27610 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
27620 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
27630 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b  proxy, pResOut);
27640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
27660 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
27670 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
27680 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
27690 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
276a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
276b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
276c0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
276d0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
276e0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
276f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
27700 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
27710 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
27720 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
27730 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
27740 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
27750 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
27760 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
27770 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
27780 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
27790 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
277a0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
277b0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
277c0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
277d0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
277e0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
277f0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
27800 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
27810 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
27820 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
27830 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
27840 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
27850 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
27860 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
27870 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
27880 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
27890 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
278a0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
278b0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
278c0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
278d0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
278e0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
278f0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
27900 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
27910 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
27920 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
27930 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
27940 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
27950 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
27960 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
27970 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
27980 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
27990 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
279a0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
279b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
279c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
279d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
279e0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
279f0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
27a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27a10 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
27a20 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
27a30 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
27a40 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
27a50 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
27a60 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
27a70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
27a80 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
27a90 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
27aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
27ab0 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
27ac0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
27ad0 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63  ype = proxy->loc
27ae0 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74  ktype;.  }.  ret
27af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
27b00 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
27b10 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
27b20 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
27b30 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
27b40 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
27b50 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
27b60 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
27b70 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
27b80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
27b90 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
27ba0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
27bb0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
27bc0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
27bd0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
27be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
27bf0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
27c00 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
27c10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
27c20 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
27c30 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
27c40 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
27c50 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
27c60 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
27c70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
27c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c90 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
27ca0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
27cb0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
27cc0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
27cd0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
27ce0 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
27cf0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
27d00 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  y;.    rc = prox
27d10 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  y->pMethod->xUnl
27d20 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
27d30 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79  e*)proxy, lockty
27d40 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  pe);.    pFile->
27d50 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
27d60 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  ->locktype;.  }.
27d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27d80 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
27d90 6c 65 20 74 68 61 74 20 75 73 65 73 20 70 72 6f  le that uses pro
27da0 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  xy locks..*/.sta
27db0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
27dc0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
27dd0 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
27de0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
27df0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
27e00 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78  le*)id;.    prox
27e10 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
27e20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
27e30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
27e40 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
27e50 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
27e60 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
27e70 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
27e80 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
27e90 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
27ea0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
27eb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27ec0 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  OK;.    .    if(
27ed0 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20   lockProxy ){.  
27ee0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
27ef0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  xy->pMethod->xUn
27f00 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
27f10 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e  le*)lockProxy, N
27f20 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  O_LOCK);.      i
27f30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27f40 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  c;.      rc = lo
27f50 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
27f60 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
27f70 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
27f80 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
27f90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27fb0 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
27fc0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
27fd0 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xy = 0;.    }.  
27fe0 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20    if( conchFile 
27ff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74  ){.      if( pCt
28000 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a  x->conchHeld ){.
28010 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
28020 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70  xyReleaseConch(p
28030 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
28040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
28050 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
28060 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
28070 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
28080 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
28090 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
280a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
280b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
280c0 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69  te3_free(conchFi
280d0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
280e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
280f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
28100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28110 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
28120 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  lePath);.    sql
28130 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
28140 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20  dbPath);.    /* 
28150 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67  restore the orig
28160 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  inal locking con
28170 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
28180 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a   then close it *
28190 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
281a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
281b0 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
281c0 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
281d0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78  ->pMethod = pCtx
281e0 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20  ->pOldMethod;.  
281f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28200 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
28210 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
28220 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d  >xClose(id);.  }
28230 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28240 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66  _OK;.}....#endif
28250 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
28260 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
28270 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28280 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
28290 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
282a0 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
282b0 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
282c0 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
282d0 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
282e0 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
282f0 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
28300 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
28310 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
28320 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
28330 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
28340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
28350 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
28360 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
28370 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
28380 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
28390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283d0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
283e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
283f0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
28400 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
28410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
28420 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
28430 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
28440 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
28450 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
28460 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
28470 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
28480 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
28490 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
284a0 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
284b0 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
284c0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
284d0 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
284e0 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
284f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
28500 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
28510 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
28520 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
28530 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
28540 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
28550 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
28560 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
28570 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
28580 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
28590 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
285a0 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
285b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
285c0 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
285d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
285e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
285f0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
28600 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
28610 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
28620 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
28630 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
28640 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
28650 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
28660 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
28670 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
28680 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
28690 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
286a0 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
286b0 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
286c0 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
286d0 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
286e0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
286f0 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
28700 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
28710 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
28720 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
28730 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
28740 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
28750 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
28760 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
28770 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
28780 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
28790 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
287a0 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
287b0 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
287c0 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
287d0 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
287e0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
287f0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
28800 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
28810 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
28820 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
28830 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
28840 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
28850 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
28860 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
28870 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
28880 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
28890 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
288a0 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
288b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
288c0 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
288d0 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
288e0 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
288f0 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
28900 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
28910 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
28920 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
28930 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
28940 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28950 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
28960 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
28970 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
28980 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
28990 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
289a0 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
289b0 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
289c0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
289d0 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
289e0 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
289f0 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
28a00 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
28a10 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
28a20 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
28a30 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
28a40 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
28a50 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
28a60 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
28a70 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28a80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31           \.    1
28a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28aa0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28ab0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28ac0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
28ad0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
28ae0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
28af0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28b00 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
28b10 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
28b20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
28b30 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28b40 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b60 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ba0 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28bc0 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
28bd0 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
28be0 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28c00 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
28c10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
28c20 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
28c30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28c40 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
28c50 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
28c60 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28c70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
28c80 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
28c90 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
28ca0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28cb0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
28cc0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
28cd0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
28ce0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
28cf0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
28d00 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
28d10 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
28d40 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
28d50 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
28d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28d90 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28db0 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
28dc0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
28dd0 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28df0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
28e00 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
28e10 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
28e20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28e30 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
28e40 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
28e50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28e60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
28e70 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
28e80 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
28e90 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
28ea0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
28eb0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  xGetLastError   
28ec0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
28ed0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
28ee0 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
28ef0 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
28f00 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
28f10 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
28f20 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
28f30 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
28f40 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
28f50 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
28f60 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
28f70 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
28f80 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
28f90 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
28fa0 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
28fb0 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
28fc0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
28fd0 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
28fe0 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
28ff0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
29000 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
29010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29020 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28  CKING_STYLE && (
29030 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65  OS_VXWORKS || de
29040 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29050 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
29060 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 61  nix",          a
29070 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
29080 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49  ),.#else.    UNI
29090 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
290a0 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e        posixIoFin
290b0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
290c0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
290d0 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63  none",     noloc
290e0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  kIoFinder ),.   
290f0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64   UNIXVFS("unix-d
29100 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63  otfile",  dotloc
29110 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  kIoFinder ),.#if
29120 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
29130 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61  UNIXVFS("unix-na
29140 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69  medsem", semIoFi
29150 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
29160 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
29170 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
29180 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
29190 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69  -posix",    posi
291a0 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
291b0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !OS_VXWORKS.   
291c0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
291d0 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49  lock",    flockI
291e0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
291f0 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
29200 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29210 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
29220 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
29230 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
29240 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49  -afp",      afpI
29250 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
29260 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f  NIXVFS("unix-pro
29270 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46  xy",    proxyIoF
29280 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
29290 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
292a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
292b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
292c0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  */..  /* Registe
292d0 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69  r all VFSes defi
292e0 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b  ned in the aVfs[
292f0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72  ] array */.  for
29300 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28  (i=0; i<(sizeof(
29310 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c  aVfs)/sizeof(sql
29320 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29  ite3_vfs)); i++)
29330 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
29340 73 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73  s_register(&aVfs
29350 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a  [i], i==0);.  }.
29360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29370 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  OK; .}../*.** Sh
29380 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61  utdown the opera
29390 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
293a0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rface..**.** Som
293b0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
293c0 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ems might need t
293d0 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75  o do some cleanu
293e0 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  p in this routin
293f0 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65  e,.** to release
29400 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
29410 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20  ocated objects. 
29420 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78   But not on unix
29430 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
29440 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  e is a no-op for
29450 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71   unix..*/.int sq
29460 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
29470 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51  d){ .  return SQ
29480 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65  LITE_OK; .}. .#e
29490 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
294a0 53 5f 55 4e 49 58 20 2a 2f 0a                    S_UNIX */.