/ Hex Artifact Content
Login

Artifact a1f05f59c24e61186c981f2a7fea13986db620f1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a 0a  e3_os_end()..**.
07f0: 2a 2a 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78 2e  ** $Id: os_unix.
0800: 63 2c 76 20 31 2e 32 33 34 20 32 30 30 39 2f 30  c,v 1.234 2009/0
0810: 31 2f 30 38 20 31 34 3a 33 36 3a 32 30 20 64 72  1/08 14:36:20 dr
0820: 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  h Exp $.*/.#incl
0830: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0840: 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ".#if SQLITE_OS_
0850: 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20 20  UNIX            
0860: 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69    /* This file i
0870: 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20 6f  s used on unix o
0880: 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  nly */../*.** Th
0890: 65 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20  ere are various 
08a0: 6d 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65  methods for file
08b0: 20 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f   locking used fo
08c0: 72 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a  r concurrency.**
08d0: 20 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20   control:.**.** 
08e0: 20 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69    1. POSIX locki
08f0: 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29  ng (the default)
0900: 2c 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63  ,.**   2. No loc
0910: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f  king,.**   3. Do
0920: 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a  t-file locking,.
0930: 2a 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20  **   4. flock() 
0940: 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e  locking,.**   5.
0950: 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53   AFP locking (OS
0960: 58 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e  X only),.**   6.
0970: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
0980: 61 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73  aphores (VXWorks
0990: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20   only),.**   7. 
09a0: 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28  proxy locking. (
09b0: 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20  OSX only).**.** 
09c0: 53 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64  Styles 4, 5, and
09d0: 20 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69   7 are only avai
09e0: 6c 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f  lable of SQLITE_
09f0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0a00: 54 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TYLE.** is defin
0a10: 65 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51  ed to 1.  The SQ
0a20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0a30: 49 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65  ING_STYLE also e
0a40: 6e 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  nables automatic
0a50: 0a 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66  .** selection of
0a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
0a70: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62   locking style b
0a80: 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  ased on the file
0a90: 73 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20  system.** where 
0aa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0ab0: 6c 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69  located.  .*/.#i
0ac0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
0ad0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0ae0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0af0: 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
0b00: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  ).#    define SQ
0b10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0b20: 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65  ING_STYLE 1.#  e
0b30: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0b40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0b50: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20  CKING_STYLE 0.# 
0b60: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0b70: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
0b80: 4f 53 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70  OS_VXWORKS pre-p
0b90: 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74  rocessor macro t
0ba0: 6f 20 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20  o 1 if building 
0bb0: 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20  on .** vxworks, 
0bc0: 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  or 0 otherwise..
0bd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58  */.#ifndef OS_VX
0be0: 57 4f 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69  WORKS.#  if defi
0bf0: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20  ned(__RTP__) || 
0c00: 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
0c10: 4e 45 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65  NEL).#    define
0c20: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20   OS_VXWORKS 1.# 
0c30: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
0c40: 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23  e OS_VXWORKS 0.#
0c50: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c60: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66  /*.** These #def
0c70: 69 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62  ines should enab
0c80: 6c 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70  le >2GB file sup
0c90: 70 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66  port on Posix if
0ca0: 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69   the.** underlyi
0cb0: 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
0cc0: 74 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e  tem supports it.
0cd0: 20 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b    If the OS lack
0ce0: 73 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20  s.** large file 
0cf0: 73 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73  support, these s
0d00: 68 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e  hould be no-ops.
0d10: 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c  .**.** Large fil
0d20: 65 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65  e support can be
0d30: 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20   disabled using 
0d40: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53  the -DSQLITE_DIS
0d50: 41 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a  ABLE_LFS switch.
0d60: 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  ** on the compil
0d70: 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e  er command line.
0d80: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
0d90: 61 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63  ary if you are c
0da0: 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61  ompiling.** on a
0db0: 20 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20   recent machine 
0dc0: 28 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29  (ex: RedHat 7.2)
0dd0: 20 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f   but you want yo
0de0: 75 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a  ur code to work.
0df0: 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d  ** on an older m
0e00: 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48  achine (ex: RedH
0e10: 61 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75  at 6.0).  If you
0e20: 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48   compile on RedH
0e30: 61 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75  at 7.2.** withou
0e40: 74 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c  t this option, L
0e50: 46 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42  FS is enable.  B
0e60: 75 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20  ut LFS does not 
0e70: 65 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72  exist in the ker
0e80: 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74  nel.** in RedHat
0e90: 20 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64   6.0, so the cod
0ea0: 65 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48  e won't work.  H
0eb0: 65 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75  ence, for maximu
0ec0: 6d 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74  m binary.** port
0ed0: 61 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75  ability you shou
0ee0: 6c 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a  ld omit LFS..**.
0ef0: 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73 20  ** The previous 
0f00: 70 61 72 61 67 72 61 70 68 20 77 61 73 20 77 72  paragraph was wr
0f10: 69 74 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20  itten in 2005.  
0f20: 28 54 68 69 73 20 70 61 72 61 67 72 61 70 68 20  (This paragraph 
0f30: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e  is written.** on
0f40: 20 32 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68   2008-11-28.) Th
0f50: 65 73 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69  ese days, all Li
0f60: 6e 75 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70  nux kernels supp
0f70: 6f 72 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c  ort large files,
0f80: 20 73 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c   so.** you shoul
0f90: 64 20 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65  d probably leave
0fa0: 20 4c 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42   LFS enabled.  B
0fb0: 75 74 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64  ut some embedded
0fc0: 20 70 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74   platforms might
0fd0: 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20  .** lack LFS in 
0fe0: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 53  which case the S
0ff0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
1000: 53 20 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74  S macro might st
1010: 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a  ill be useful..*
1020: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1030: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
1040: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
1050: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
1060: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
1070: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
1080: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
1090: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
10a0: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
10b0: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
10c0: 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64  ../*.** standard
10d0: 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a   include files..
10e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  */.#include <sys
10f0: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
1100: 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a  de <sys/stat.h>.
1110: 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e  #include <fcntl.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
1130: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
1140: 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <time.h>.#includ
1150: 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23  e <sys/time.h>.#
1160: 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68  include <errno.h
1170: 3e 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  >..#if SQLITE_EN
1180: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1190: 4c 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  LE.# include <sy
11a0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 66 20  s/ioctl.h>.# if 
11b0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e  OS_VXWORKS.#  in
11c0: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
11d0: 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  .h>.#  include <
11e0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65  limits.h>.# else
11f0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
1200: 2f 66 69 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c  /file.h>.#  incl
1210: 75 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68  ude <sys/param.h
1220: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1230: 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 20 65 6e 64  s/mount.h>.# end
1240: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1250: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1260: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
1270: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f 20  ** If we are to 
1280: 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20  be thread-safe, 
1290: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68 72  include the pthr
12a0: 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64 20  eads header and 
12b0: 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51  define.** the SQ
12c0: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
12d0: 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  S macro..*/.#if 
12e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
12f0: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  E.# include <pth
1300: 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65  read.h>.# define
1310: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
1320: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EADS 1.#endif../
1330: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  *.** Default per
1340: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
1350: 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c  eating a new fil
1360: 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e.*/.#ifndef SQL
1370: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1380: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64  _PERMISSIONS.# d
1390: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46  efine SQLITE_DEF
13a0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
13b0: 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69  SIONS 0644.#endi
13c0: 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c  f../*. ** Defaul
13d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
13e0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f  en creating auto
13f0: 20 70 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23   proxy dir. */.#
1400: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1410: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
1420: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1430: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1440: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
1450: 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e  ISSIONS 0755.#en
1460: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1470: 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74  um supported pat
1480: 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65  h-length..*/.#de
1490: 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d  fine MAX_PATHNAM
14a0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c  E 512../*.** Onl
14b0: 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72  y set the lastEr
14c0: 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  rno if the error
14d0: 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20   code is a real 
14e0: 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a  error and not .*
14f0: 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63  * a normal expec
1500: 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ted return code 
1510: 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  of SQLITE_BUSY o
1520: 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23  r SQLITE_OK.*/.#
1530: 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45  define IS_LOCK_E
1540: 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20  RROR(x)  ((x != 
1550: 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78  SQLITE_OK) && (x
1560: 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29   != SQLITE_BUSY)
1570: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  ).../*.** The un
1580: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1590: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
15a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
15b0: 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69  cific to the uni
15c0: 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65  x.** VFS impleme
15d0: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70  ntations..*/.typ
15e0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
15f0: 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73  File unixFile;.s
1600: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b  truct unixFile {
1610: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
1620: 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65  thods const *pMe
1630: 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73  thod;  /* Always
1640: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1650: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
1660: 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b  xOpenCnt *pOpen;
1670: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1680: 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64  bout all open fd
1690: 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  's on this inode
16a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
16b0: 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b  xLockInfo *pLock
16c0: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61  ;      /* Info a
16d0: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
16e0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
16f0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1710: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
1720: 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64  iptor */.  int d
1730: 69 72 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  irfd;           
1740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1750: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1760: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1770: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1780: 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  har locktype;   
1790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79         /* The ty
17a0: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
17b0: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
17c0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72   /* The unix err
17f0: 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
1800: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20   I/O error */.  
1810: 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e  void *lockingCon
1820: 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  text;           
1830: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1840: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1850: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
1860: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1870: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1880: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1890: 20 6f 70 65 6e 20 2a 2f 0a 23 69 66 20 53 51 4c   open */.#if SQL
18a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
18b0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
18c0: 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74  x__).  pthread_t
18d0: 20 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   tid;           
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
18f0: 68 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73  hread that "owns
1900: 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  " this unixFile 
1910: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1920: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69  _VXWORKS.  int i
1930: 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20  sDelete;        
1940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1950: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69  elete on close i
1960: 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72 75  f true */.  stru
1970: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
1980: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *pId;       /* 
1990: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
19a0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
19b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
19c0: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
19d0: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
19e0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
19f0: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
1a00: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
1a10: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
1a20: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
1a30: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
1a40: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
1a50: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
1a60: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  if.};../*.** Inc
1a70: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
1a80: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
1a90: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
1aa0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
1ab0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
1ac0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
1ad0: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
1ae0: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
1af0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
1b00: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
1b10: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
1b20: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
1b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
1b40: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
1b50: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
1b60: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
1b70: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1b80: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
1b90: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
1ba0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1bb0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
1bc0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
1bd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1be0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
1bf0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
1c00: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
1c10: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
1c20: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
1c30: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
1c40: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
1c50: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1c60: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
1c70: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
1c80: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
1c90: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
1ca0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
1cb0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
1cc0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1cd0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1ce0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1cf0: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
1d00: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
1d10: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
1d20: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
1d30: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
1d40: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
1d50: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1d60: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1d70: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1d80: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
1d90: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
1da0: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
1db0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
1dc0: 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1dd0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
1de0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
1df0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
1e00: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a 2a 2f  global mutex..*/
1e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e20: 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  xEnterMutex(void
1e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
1e40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
1e50: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1e60: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1e70: 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
1e80: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
1e90: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
1ea0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1eb0: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
1ec0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1ed0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
1ee0: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
1ef0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1f00: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
1f10: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
1f20: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
1f30: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
1f40: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
1f50: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
1f60: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
1f70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
1f80: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
1f90: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
1fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1fb0: 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69   *locktypeName(i
1fc0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1fd0: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
1fe0: 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f   ){.  case NO_LO
1ff0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
2000: 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45 44  ";.  case SHARED
2010: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
2020: 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52  HARED";.  case R
2030: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
2040: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
2050: 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f  .  case PENDING_
2060: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
2070: 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45  NDING";.  case E
2080: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72  XCLUSIVE_LOCK: r
2090: 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45  eturn "EXCLUSIVE
20a0: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
20b0: 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69  "ERROR";.}.#endi
20c0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
20d0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
20e0: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
20f0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
2100: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
2110: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
2120: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2130: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
2140: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
2150: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
2160: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
2170: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
2180: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
2190: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
21a0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
21b0: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
21c0: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
21d0: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
21e0: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
21f0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
2200: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
2210: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
2220: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
2230: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
2240: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
2250: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
2260: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
2270: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
2280: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
2290: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
22a0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
22b0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
22c0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c     s = fcntl(fd,
22d0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
22e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22f0: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
2300: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
2310: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
2320: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
2330: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
2340: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
2350: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
2360: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
2370: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
2380: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
2390: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
23a0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
23b0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
23c0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
23d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
23e0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
23f0: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
2400: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
2410: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
2420: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
2430: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
2440: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
2450: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
2460: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
2470: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
2480: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
2490: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
24a0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
24b0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
24c0: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
24d0: 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d   s==(-1) && op==
24e0: 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c  F_SETLK && (p->l
24f0: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c  _type==F_RDLCK |
2500: 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  | p->l_type==F_W
2510: 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72  RLCK) ){.    str
2520: 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20  uct flock l2;.  
2530: 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66    l2 = *p;.    f
2540: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
2550: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
2560: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
2570: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
2580: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
2590: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
25a0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
25b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
25c0: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
25d0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
25e0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
25f0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
2600: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
2610: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2620: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2630: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2640: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
2650: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
2660: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
2670: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
2680: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
2690: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
26a0: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
26b0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
26c0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69  eturn s;.}.#defi
26d0: 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61  ne fcntl lockTra
26e0: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
26f0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
2700: 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /..../*.** This 
2710: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
2720: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
2730: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
2740: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
2750: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
2760: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
2770: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
2780: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
2790: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
27a0: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
27b0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
27c0: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
27d0: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
27e0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
27f0: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
2800: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2810: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
2820: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
2830: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
2840: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
2850: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
2860: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
2870: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
2880: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
2890: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
28a0: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
28b0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
28c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28d0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
28e0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
28f0: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
2900: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
2910: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
2920: 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20  ) {.  case 0: . 
2930: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2940: 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  _OK;.    .  case
2950: 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20   EAGAIN:.  case 
2960: 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73  ETIMEDOUT:.  cas
2970: 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20  e EBUSY:.  case 
2980: 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e  EINTR:.  case EN
2990: 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72  OLCK:  .    /* r
29a0: 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20  andom NFS retry 
29b0: 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75  error, unless du
29c0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
29d0: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
29e0: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
29f0: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
2a00: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
2a10: 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72  it says */.    r
2a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2a30: 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  Y;.    .  case E
2a40: 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45  ACCES: .    /* E
2a50: 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41  ACCES is like EA
2a60: 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b  GAIN during lock
2a70: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ing operations, 
2a80: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65  but not any othe
2a90: 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28  r time*/.    if(
2aa0: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
2ab0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2ac0: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
2ad0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
2ae0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
2af0: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
2b00: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
2b10: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c  RDLOCK) ||..(sql
2b20: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
2b30: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
2b40: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
2b50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b60: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
2b70: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
2b80: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
2b90: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
2ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2bb0: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 44  ;.    .  case ED
2bc0: 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72  EADLK:.    retur
2bd0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  n SQLITE_IOERR_B
2be0: 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66  LOCKED;.    .#if
2bf0: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
2c00: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
2c10: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
2c20: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
2c30: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
2c40: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
2c50: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
2c60: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
2c70: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
2c80: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
2c90: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
2ca0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
2cb0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
2cc0: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
2cd0: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
2ce0: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
2cf0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
2d00: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
2d10: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
2d20: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
2d30: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
2d40: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
2d50: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
2d60: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
2d70: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
2d80: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
2d90: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
2da0: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63  case ENOENT:.  c
2db0: 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61  ase ESTALE:.  ca
2dc0: 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f  se ENOSYS:.    /
2dd0: 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66  * these should f
2de0: 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20  orce the client 
2df0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  to close the fil
2e00: 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20  e and reconnect 
2e10: 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c  */.    .  defaul
2e20: 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t: .    return s
2e30: 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a  qliteIOErr;.  }.
2e40: 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }..../**********
2e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e90: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2ea0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e  ******* Begin Un
2eb0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
2ec0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
2ed0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
2ee0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f  ****.**.** On mo
2ef0: 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75  st versions of u
2f00: 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20  nix, we can get 
2f10: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
2f20: 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74  a file by concat
2f30: 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64  enating.** the d
2f40: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64  evice number and
2f50: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
2f60: 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65  r.  But this doe
2f70: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
2f80: 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57  Works..** On VxW
2f90: 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66  orks, a unique f
2fa0: 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62  ile id must be b
2fb0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f  ased on the cano
2fc0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  nical filename..
2fd0: 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
2fe0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2ff0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3000: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
3010: 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e   used as a.** un
3020: 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20  ique file ID in 
3030: 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69  VxWorks.  Each i
3040: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
3050: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
3060: 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  ns.** a copy of 
3070: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
3080: 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69  lename.  There i
3090: 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e  s also a referen
30a0: 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54  ce count.  .** T
30b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
30c0: 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74  reclaimed when t
30d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69  he number of poi
30e0: 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70  nters to it drop
30f0: 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  s to.** zero..**
3100: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65  .** There are ne
3110: 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69  ver very many fi
3120: 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20  les open at one 
3130: 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73  time and lookups
3140: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65   are not.** a pe
3150: 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63  rformance-critic
3160: 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69  al path, so it i
3170: 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
3180: 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72  put these.** str
3190: 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e  uctures on a lin
31a0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ked list..*/.str
31b0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
31c0: 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  d {.  struct vxw
31d0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78  orksFileId *pNex
31e0: 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61  t;  /* Next in a
31f0: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
3200: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  l */.  int nRef;
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3230: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
3240: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e  this one */.  in
3250: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
3260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3270: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61  ength of the zCa
3280: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74  nonicalName[] st
3290: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
32a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20  zCanonicalName; 
32b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e          /* Canon
32c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  ical filename */
32d0: 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .};..#if OS_VXWO
32e0: 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75  RKS./* .** All u
32f0: 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20  nique filenames 
3300: 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69  are held on a li
3310: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64  nked list headed
3320: 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   by this.** vari
3330: 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  able:.*/.static 
3340: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3350: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c  leId *vxworksFil
3360: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
3370: 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c  * Simplify a fil
3380: 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63  ename into its c
3390: 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a  anonical form.**
33a0: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
33b0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
33c0: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  :.**.**  * remov
33d0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
33e0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
33f0: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
3400: 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  ./ into just /.*
3410: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f  *  * convert /A/
3420: 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61  ../ where A is a
3430: 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69  ny simple name i
3440: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a  nto just /.**.**
3450: 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   Changes are mad
3460: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74  e in-place.  Ret
3470: 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65  urn the new name
3480: 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54   length..**.** T
3490: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
34a0: 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e  name is in z[0..
34b0: 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68  n-1].  Return th
34c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  e number of.** c
34d0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
34e0: 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65   simplified name
34f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3500: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
3510: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
3520: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   n){.  int i, j;
3530: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
3540: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
3550: 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a  n--; }.  for(i=j
3560: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
3570: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27     if( z[i]=='/'
3580: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
3590: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
35a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
35b0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
35c0: 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +2<n && z[i+2]==
35d0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
35e0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
35f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
3600: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
3610: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20  ]=='.' && i+3<n 
3620: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  && z[i+2]=='.' &
3630: 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  & z[i+3]=='/' ){
3640: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
3650: 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27  j>0 && z[j-1]!='
3660: 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
3670: 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20       if( j>0 ){ 
3680: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
3690: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
36a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
36b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b  .    }.    z[j++
36c0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
36d0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[j] = 0;.  retu
36e0: 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
36f0: 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ind a unique fil
3700: 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76  e ID for the giv
3710: 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  en absolute path
3720: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  name.  Return.**
3730: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3740: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
3750: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f  object.  This po
3760: 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69  inter is the uni
3770: 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a  que.** file ID..
3780: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66  **.** The nRef f
3790: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f  ield of the vxwo
37a0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
37b0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
37c0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62  before.** the ob
37d0: 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64  ject is returned
37e0: 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73  .  A new vxworks
37f0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
3800: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
3810: 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f  added to the glo
3820: 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65  bal list if nece
3830: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3840: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
3850: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
3860: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
3870: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
3880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
3890: 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
38a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62  (const char *zAb
38b0: 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73  soluteName){.  s
38c0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
38d0: 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  eId *pNew;      
38e0: 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79     /* search key
38f0: 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44   and new file ID
3900: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
3910: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e  orksFileId *pCan
3920: 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72  didate;   /* For
3930: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
3940: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20  isting file IDs 
3950: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
3980: 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e  th of zAbsoluteN
3990: 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  ame string */.. 
39a0: 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75   assert( zAbsolu
39b0: 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  teName[0]=='/' )
39c0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
39d0: 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  len(zAbsoluteNam
39e0: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  e);.  pNew = sql
39f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
3a00: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
3a10: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
3a20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3a30: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
3a40: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
3a50: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
3a60: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
3a70: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
3a80: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
3a90: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
3aa0: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
3ab0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
3ac0: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
3ad0: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
3ae0: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
3af0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
3b00: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
3b10: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
3b20: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
3b30: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
3b40: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
3b50: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
3b60: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
3b70: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
3b80: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
3b90: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
3ba0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
3bb0: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
3bc0: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
3bd0: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
3be0: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
3bf0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
3c00: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
3c10: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
3c20: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
3c30: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
3c40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
3c50: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
3c60: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
3c70: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
3c80: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
3c90: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
3ca0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3cb0: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
3cc0: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
3cd0: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
3ce0: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
3cf0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
3d00: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
3d10: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
3d20: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
3d30: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
3d40: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
3d50: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
3d60: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3d70: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
3d80: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
3d90: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
3da0: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
3db0: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
3dc0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
3dd0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
3de0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
3df0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
3e00: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
3e10: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
3e20: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
3e30: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
3e40: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
3e50: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
3e60: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
3e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
3e80: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3e90: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
3ea0: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
3eb0: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
3ec0: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
3ed0: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
3ee0: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
3ef0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
3f00: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
3f10: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
3f20: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
3f30: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
3f40: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
3f50: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
3f60: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
3f70: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
3f80: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
3f90: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
3fa0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
3fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ff0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
4000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4040: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
4050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4060: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
4070: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4090: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
40a0: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
40b0: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
40c0: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
40d0: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
40e0: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
40f0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
4100: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
4110: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
4120: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
4130: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
4140: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
4150: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
4160: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
4170: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4180: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
4190: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
41a0: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
41b0: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
41c0: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
41d0: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
41e0: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
41f0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
4200: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
4210: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
4220: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
4230: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
4240: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
4250: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
4260: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
4270: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
4280: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
4290: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
42a0: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
42b0: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
42c0: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
42d0: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
42e0: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
42f0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
4300: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
4310: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
4320: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
4330: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
4340: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
4350: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
4360: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
4370: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
4380: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
4390: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
43a0: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
43b0: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
43c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
43d0: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
43e0: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
43f0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
4400: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
4410: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
4420: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
4430: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
4440: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
4450: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
4460: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
4470: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
4480: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
4490: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
44a0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
44b0: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
44c0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
44d0: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
44e0: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
44f0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
4500: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4510: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
4520: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
4530: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
4540: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
4550: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
4560: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
4570: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
4580: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
4590: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
45a0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
45b0: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
45c0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
45d0: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
45e0: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
45f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
4600: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
4610: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
4620: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
4630: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
4640: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
4650: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
4660: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
4670: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
4680: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
4690: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
46a0: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
46b0: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
46c0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
46d0: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
46e0: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
46f0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
4700: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
4710: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
4720: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
4730: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
4740: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
4750: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
4760: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
4770: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
4780: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
4790: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
47a0: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
47b0: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
47c0: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
47d0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
47e0: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
47f0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
4800: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
4810: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
4820: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
4830: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
4840: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
4850: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
4860: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
4870: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
4880: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
4890: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
48a0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
48b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
48c0: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
48d0: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
48e0: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
48f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
4900: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
4910: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
4920: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
4930: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
4940: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
4950: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
4960: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
4970: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
4980: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
4990: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
49a0: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
49b0: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
49c0: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
49d0: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
49e0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
49f0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
4a00: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
4a10: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
4a20: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
4a30: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
4a40: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
4a50: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
4a60: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
4a70: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
4a80: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
4a90: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
4aa0: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
4ab0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
4ac0: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
4ad0: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
4ae0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
4af0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
4b00: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
4b10: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
4b20: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
4b30: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
4b40: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
4b50: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
4b60: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
4b70: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
4b80: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
4b90: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
4ba0: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
4bb0: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
4bc0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
4bd0: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
4be0: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
4bf0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
4c00: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
4c10: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
4c20: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
4c30: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
4c40: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
4c50: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
4c60: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
4c70: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
4c80: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
4c90: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
4ca0: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
4cb0: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
4cc0: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
4cd0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
4ce0: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
4cf0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
4d00: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
4d10: 61 63 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  ach unixFile str
4d20: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
4d30: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
4d40: 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  an unixOpenCnt s
4d50: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
4d60: 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65 6e   is one unixOpen
4d70: 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  Cnt structure.**
4d80: 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c   per open inode,
4d90: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
4da0: 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46  t multiple unixF
4db0: 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f  ile can point to
4dc0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e 69   a single.** uni
4dd0: 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20  xOpenCnt.  When 
4de0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
4df0: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
4e00: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
4e10: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
4e20: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
4e30: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
4e40: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
4e50: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
4e60: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
4e70: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
4e80: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
4e90: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
4ea0: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
4eb0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
4ec0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
4ed0: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
4ee0: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
4ef0: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
4f00: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
4f10: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
4f20: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
4f30: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
4f40: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
4f50: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
4f60: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
4f70: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
4f80: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
4f90: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
4fa0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
4fb0: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
4fc0: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
4fd0: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
4fe0: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
4ff0: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
5000: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
5010: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
5020: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
5030: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
5040: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
5050: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
5060: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
5070: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
5080: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
5090: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
50a0: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
50b0: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
50c0: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
50d0: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
50e0: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
50f0: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
5100: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
5110: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
5120: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
5130: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
5140: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
5150: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
5160: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
5170: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
5180: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
5190: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
51a0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
51b0: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
51c0: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
51d0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
51e0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
51f0: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
5200: 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  ** We have to do
5210: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
5220: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
5230: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
5240: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
5250: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  cess..**.** On s
5260: 79 73 74 65 6d 73 20 77 68 65 72 65 20 74 68 72  ystems where thr
5270: 65 61 64 20 41 20 69 73 20 75 6e 61 62 6c 65 20  ead A is unable 
5280: 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73 20  to modify locks 
5290: 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  created by.** th
52a0: 72 65 61 64 20 42 2c 20 77 65 20 68 61 76 65 20  read B, we have 
52b0: 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  to keep track of
52c0: 20 77 68 69 63 68 20 74 68 72 65 61 64 20 63 72   which thread cr
52d0: 65 61 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c 6f  eated each.** lo
52e0: 63 6b 2e 20 20 48 65 6e 63 65 20 74 68 65 72 65  ck.  Hence there
52f0: 20 69 73 20 61 6e 20 65 78 74 72 61 20 66 69 65   is an extra fie
5300: 6c 64 20 69 6e 20 74 68 65 20 6b 65 79 20 74 6f  ld in the key to
5310: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66   the unixLockInf
5320: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  o.** structure t
5330: 6f 20 72 65 63 6f 72 64 20 74 68 69 73 20 69 6e  o record this in
5340: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64 20  formation.  And 
5350: 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  on those systems
5360: 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67 61   it.** is illega
5370: 6c 20 74 6f 20 62 65 67 69 6e 20 61 20 74 72 61  l to begin a tra
5380: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20  nsaction in one 
5390: 74 68 72 65 61 64 20 61 6e 64 20 66 69 6e 69 73  thread and finis
53a0: 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74 68  h it.** in anoth
53b0: 65 72 2e 20 20 46 6f 72 20 74 68 69 73 20 6c 61  er.  For this la
53c0: 74 74 65 72 20 72 65 73 74 72 69 63 74 69 6f 6e  tter restriction
53d0: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  , there is no wo
53e0: 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49 74  rk-around..** It
53f0: 20 69 73 20 61 20 6c 69 6d 69 74 61 74 69 6f 6e   is a limitation
5400: 20 6f 66 20 4c 69 6e 75 78 54 68 72 65 61 64 73   of LinuxThreads
5410: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ..*/../*.** Set 
5420: 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69  or check the uni
5430: 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e  xFile.tid field.
5440: 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20    This field is 
5450: 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69 78  set when an unix
5460: 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74  File.** is first
5470: 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75   opened.  All su
5480: 62 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66  bsequent uses of
5490: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76 65   the unixFile ve
54a0: 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a 2a  rify that the.**
54b0: 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73 20   same thread is 
54c0: 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65  operating on the
54d0: 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d 65   unixFile.  Some
54e0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
54f0: 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c  ms do.** not all
5500: 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f  ow locks to be o
5510: 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68  verridden by oth
5520: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 74  er threads and t
5530: 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  hat restriction.
5540: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71  ** means that sq
5550: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
5560: 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62  handles cannot b
5570: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65  e moved from one
5580: 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e   thread.** to an
5590: 6f 74 68 65 72 20 77 68 69 6c 65 20 6c 6f 63 6b  other while lock
55a0: 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  s are held..**.*
55b0: 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20  * Version 3.3.1 
55c0: 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 75  (2006-01-15):  u
55d0: 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20 6d  nixFile can be m
55e0: 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68  oved from one th
55f0: 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68  read to.** anoth
5600: 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  er as long as we
5610: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
5620: 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  a system that su
5630: 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a  pports threads.*
5640: 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63  * overriding eac
5650: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
5660: 77 68 69 63 68 20 69 73 20 6e 6f 77 20 74 68 65  which is now the
5670: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68   most common beh
5680: 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20  avior).** or if 
5690: 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  no locks are hel
56a0: 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69 78  d.  But the unix
56b0: 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64  File.pLock field
56c0: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20   needs to be.** 
56d0: 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75  recomputed becau
56e0: 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75  se its key inclu
56f0: 64 65 73 20 74 68 65 20 74 68 72 65 61 64 2d 69  des the thread-i
5700: 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20  d.  See the .** 
5710: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
5720: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c  p() function bel
5730: 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ow for additiona
5740: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f  l information.*/
5750: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
5760: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
5770: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64  d(__linux__).# d
5780: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
5790: 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64  ID(X)   (X)->tid
57a0: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
57b0: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
57c0: 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68  _THREADID(X) (th
57d0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
57e0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20  hOthersLocks==0 
57f0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  && \.           
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
5820: 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  (X)->tid, pthrea
5830: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
5840: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
5850: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
5860: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
5870: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
5880: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
5890: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
58a0: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
58b0: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
58c0: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
58d0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
58e0: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75  xOpenCnt structu
58f0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
5900: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
5910: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
5920: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63 65  unixLockKey exce
5930: 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65  pt that the thre
5940: 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64  ad ID is omitted
5950: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
5960: 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74  FileId {.  dev_t
5970: 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   dev;           
5980: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
5990: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f   number */.#if O
59a0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
59b0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
59c0: 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75   *pId;  /* Uniqu
59d0: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78  e file ID for vx
59e0: 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  works. */.#else.
59f0: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a10: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
5a20: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
5a30: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
5a40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
5a50: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
5a60: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
5a70: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
5a80: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4c 6f  articular unixLo
5a90: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
5aa0: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
5ab0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65 61  ..**.** If threa
5ac0: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
5ad0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
5ae0: 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68 72 65 61  ocks (LinuxThrea
5af0: 64 73 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20  ds), then we.** 
5b00: 73 65 74 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  set the unixLock
5b10: 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f  Key.tid field to
5b20: 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e 20   the thread ID. 
5b30: 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   If threads can 
5b40: 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68  override.** each
5b50: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 50   others locks (P
5b60: 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c 29 20 74  osix and NPTL) t
5b70: 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79  hen tid is alway
5b80: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
5b90: 2a 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64  * tid is omitted
5ba0: 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77   if we compile w
5bb0: 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67  ithout threading
5bc0: 20 73 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20 61   support or on a
5bd0: 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74 68  n OS.** other th
5be0: 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 72  an linux..*/.str
5bf0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20  uct unixLockKey 
5c00: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
5c10: 69 6c 65 49 64 20 66 69 64 3b 20 20 2f 2a 20 55  ileId fid;  /* U
5c20: 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72  nique identifier
5c30: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
5c40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
5c50: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
5c60: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70  d(__linux__).  p
5c70: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 2f  thread_t tid;  /
5c80: 2a 20 54 68 72 65 61 64 20 49 44 20 6f 66 20 6c  * Thread ID of l
5c90: 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f 20  ock owner. Zero 
5ca0: 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69 6e  if not using Lin
5cb0: 75 78 54 68 72 65 61 64 73 20 2a 2f 0a 23 65 6e  uxThreads */.#en
5cc0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
5cd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5cf0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
5d00: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
5d10: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
5d20: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
5d30: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
5d40: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
5d50: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
5d60: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
5d70: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
5d80: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
5d90: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
5da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5db0: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
5dc0: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
5dd0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
5de0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
5df0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
5e00: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
5e10: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
5e20: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
5e30: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
5e40: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
5e50: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
5e60: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
5e70: 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b  nixLockKey lockK
5e80: 65 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ey;     /* The l
5e90: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
5ea0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
5ed0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
5ee0: 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b  .  int locktype;
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
5f10: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
5f20: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
5f30: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
5f60: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
5f70: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73  structure */.  s
5f80: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
5f90: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f  fo *pNext;     /
5fa0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
5fb0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  ixLockInfo objec
5fc0: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ts */.  struct u
5fd0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50 72  nixLockInfo *pPr
5fe0: 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e  ev;     /*    ..
5ff0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
6000: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
6010: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6020: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6030: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
6040: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
6050: 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20  ** inode.  This 
6060: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
6070: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d  track of the num
6080: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20  ber of locks on 
6090: 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  that.** inode.  
60a0: 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74  If a close is at
60b0: 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20  tempted against 
60c0: 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73  an inode that is
60d0: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b   holding.** lock
60e0: 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20  s, the close is 
60f0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
6100: 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62  ll locks clear b
6110: 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20  y adding the.** 
6120: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6130: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20  to be closed to 
6140: 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74  the pending list
6150: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43  ..**.** TODO:  C
6160: 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e 67  onsider changing
6170: 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74 68   this so that th
6180: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
6190: 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73  ngle file.** des
61a0: 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63 68  criptor for each
61b0: 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65 6e   open file, even
61c0: 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65 6e   when it is open
61d0: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
61e0: 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65 28  s..** The close(
61f0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 6f  ) system call wo
6200: 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77  uld only occur w
6210: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61 74  hen the last dat
6220: 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20 74  abase.** using t
6230: 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e 0a  he file closes..
6240: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f 70  */.struct unixOp
6250: 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 74  enCnt {.  struct
6260: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
6270: 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  Id;   /* The loo
6280: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
6290: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
62a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
62b0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
62c0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
62d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
6300: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
6310: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69   */.  int nPendi
6320: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
6330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
6340: 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f  ending close() o
6350: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
6360: 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20  nt *aPending;   
6370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c           /* Mall
6380: 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c 64 69  oced space holdi
6390: 6e 67 20 66 64 27 73 20 61 77 61 69 74 69 6e 67  ng fd's awaiting
63a0: 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 23 69   a close() */.#i
63b0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
63c0: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
63f0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
6400: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
6410: 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 2f  PATHNAME+1];   /
6420: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
6430: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
6440: 69 66 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  if.  struct unix
6450: 4f 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74 2c 20  OpenCnt *pNext, 
6460: 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73  *pPrev;   /* Lis
6470: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4f 70 65  t of all unixOpe
6480: 6e 43 6e 74 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  nCnt objects */.
6490: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20  };../*.** Lists 
64a0: 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49  of all unixLockI
64b0: 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e  nfo and unixOpen
64c0: 43 6e 74 20 6f 62 6a 65 63 74 73 2e 20 20 54 68  Cnt objects.  Th
64d0: 65 73 65 20 75 73 65 64 20 74 6f 20 62 65 20 68  ese used to be h
64e0: 61 73 68 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20  ash.** tables.  
64f0: 42 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  But the number o
6500: 66 20 6f 62 6a 65 63 74 73 20 69 73 20 72 61 72  f objects is rar
6510: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 61 20  ely more than a 
6520: 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76  dozen and.** nev
6530: 65 72 20 65 78 63 65 65 64 73 20 61 20 66 65 77  er exceeds a few
6540: 20 74 68 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20   thousand.  And 
6550: 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e  lookup is not on
6560: 20 61 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70   a critical.** p
6570: 61 74 68 20 73 6f 20 61 20 73 69 6d 70 6c 65 20  ath so a simple 
6580: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c  linked list will
6590: 20 73 75 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61   suffice..*/.sta
65a0: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 4c  tic struct unixL
65b0: 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73  ockInfo *lockLis
65c0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73 74  t = 0;.static st
65d0: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
65e0: 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20 30 3b 0a   *openList = 0;.
65f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
6600: 61 62 6c 65 20 72 65 6d 65 6d 62 65 72 73 20 77  able remembers w
6610: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
6620: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
6630: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
6640: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
6650: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
6660: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
6670: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
6680: 6f 63 6b 73 2e 20 20 28 4c 69 6e 75 78 54 68 72  ocks.  (LinuxThr
6690: 65 61 64 73 29 0a 2a 2a 20 20 20 20 31 3a 20 20  eads).**    1:  
66a0: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
66b0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
66c0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28  others locks.  (
66d0: 50 6f 73 69 78 20 26 20 4e 4c 50 54 29 0a 2a 2a  Posix & NLPT).**
66e0: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
66f0: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a   know yet..**.**
6700: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
6710: 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  , we know at com
6720: 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72  pile-time if thr
6730: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
6740: 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73  e each.** others
6750: 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73   locks.  On thos
6760: 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53  e systems, the S
6770: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
6780: 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f  RRIDE_LOCK macro
6790: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
67a0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20  appropriately.  
67b0: 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  On other systems
67c0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65  , we have to che
67d0: 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ck at.** runtime
67e0: 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74  .  On these latt
67f0: 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54  er systems, SQLT
6800: 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  IE_THREAD_OVERRI
6810: 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e  DE_LOCK is.** un
6820: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
6830: 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72  his variable nor
6840: 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73  mally has file s
6850: 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20  cope only.  But 
6860: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  during testing, 
6870: 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20  we make.** it a 
6880: 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74  global so that t
6890: 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e  he test code can
68a0: 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75   change its valu
68b0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  e in order to ve
68c0: 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65  rify.** that the
68d0: 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70   right stuff hap
68e0: 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63  pens in either c
68f0: 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ase..*/.#if SQLI
6900: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
6910: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
6920: 5f 5f 29 0a 23 20 20 69 66 6e 64 65 66 20 53 51  __).#  ifndef SQ
6930: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
6940: 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 20 20 20 64  RIDE_LOCK.#    d
6950: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52  efine SQLITE_THR
6960: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
6970: 4b 20 2d 31 0a 23 20 20 65 6e 64 69 66 0a 23 20  K -1.#  endif.# 
6980: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45   ifdef SQLITE_TE
6990: 53 54 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76  ST.int threadsOv
69a0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
69b0: 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54  Locks = SQLITE_T
69c0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
69d0: 4f 43 4b 3b 0a 23 20 20 65 6c 73 65 0a 73 74 61  OCK;.#  else.sta
69e0: 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f  tic int threadsO
69f0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
6a00: 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f  sLocks = SQLITE_
6a10: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6a20: 4c 4f 43 4b 3b 0a 23 20 20 65 6e 64 69 66 0a 23  LOCK;.#  endif.#
6a30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
6a40: 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  s structure hold
6a50: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  s information pa
6a60: 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69  ssed into indivi
6a70: 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72  dual test.** thr
6a80: 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74  eads by the test
6a90: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
6aa0: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e  avior() routine.
6ab0: 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61  .*/.struct threa
6ac0: 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e  dTestData {.  in
6ad0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
6ae0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
6af0: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73  be locked */.  s
6b00: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
6b10: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  ;     /* The loc
6b20: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
6b30: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20  /.  int result; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6b50: 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b  sult of the lock
6b60: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
6b70: 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  .};..#if SQLITE_
6b80: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
6b90: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
6ba0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6bb0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
6bc0: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
6bd0: 20 66 6f 72 20 61 20 74 68 72 65 61 64 20 6c 61   for a thread la
6be0: 75 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74 65 73  unched by.** tes
6bf0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
6c00: 68 61 76 69 6f 72 28 29 2e 20 49 74 20 74 65 73  havior(). It tes
6c10: 74 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73  ts whether the s
6c20: 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74 61 69  hared-lock obtai
6c30: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 61  ned.** by the ma
6c40: 69 6e 20 74 68 72 65 61 64 20 69 6e 20 74 65 73  in thread in tes
6c50: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
6c60: 68 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c 69 63  havior() conflic
6c70: 74 73 20 77 69 74 68 20 61 0a 2a 2a 20 68 79 70  ts with a.** hyp
6c80: 6f 74 68 65 74 69 63 61 6c 20 77 72 69 74 65 2d  othetical write-
6c90: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 62 79  lock obtained by
6ca0: 20 74 68 69 73 20 74 68 72 65 61 64 20 6f 6e 20   this thread on 
6cb0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a  the same file..*
6cc0: 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 2d 6c  *.** The write-l
6cd0: 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 74 75 61  ock is not actua
6ce0: 6c 6c 79 20 61 63 71 75 69 72 65 64 2c 20 61 73  lly acquired, as
6cf0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
6d00: 73 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74 68 65  sible if .** the
6d10: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 69 6e   file is open in
6d20: 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20   read-only mode 
6d30: 28 73 65 65 20 74 69 63 6b 65 74 20 23 33 34 37  (see ticket #347
6d40: 32 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  2)..*/ .static v
6d50: 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69  oid *threadLocki
6d60: 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41 72  ngTest(void *pAr
6d70: 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68 72  g){.  struct thr
6d80: 65 61 64 54 65 73 74 44 61 74 61 20 2a 70 44 61  eadTestData *pDa
6d90: 74 61 20 3d 20 28 73 74 72 75 63 74 20 74 68 72  ta = (struct thr
6da0: 65 61 64 54 65 73 74 44 61 74 61 2a 29 70 41 72  eadTestData*)pAr
6db0: 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73 75  g;.  pData->resu
6dc0: 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74 61  lt = fcntl(pData
6dd0: 2d 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  ->fd, F_GETLK, &
6de0: 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20  pData->lock);.  
6df0: 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 23  return pArg;.}.#
6e00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6e10: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
6e20: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
6e30: 20 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45   */...#if SQLITE
6e40: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
6e50: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
6e60: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  )./*.** This pro
6e70: 63 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20  cedure attempts 
6e80: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
6e90: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
6ea0: 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72  ads.** can overr
6eb0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
6ec0: 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20  locks then sets 
6ed0: 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f  the .** threadsO
6ee0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
6ef0: 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20  sLocks variable 
6f00: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a  appropriately..*
6f10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
6f20: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
6f30: 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f  ehavior(int fd_o
6f40: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
6f50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
6f60: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
6f70: 61 20 64 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  a d;.  struct fl
6f80: 6f 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65 61 64  ock l;.  pthread
6f90: 5f 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20 64 75  _t t;..  fd = du
6fa0: 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66  p(fd_orig);.  if
6fb0: 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b  ( fd<0 ) return;
6fc0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20 30 2c  .  memset(&l, 0,
6fd0: 20 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20 20 6c   sizeof(l));.  l
6fe0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
6ff0: 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31  K;.  l.l_len = 1
7000: 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20 3d 20  ;.  l.l_start = 
7010: 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63 65 20  0;.  l.l_whence 
7020: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 72 63  = SEEK_SET;.  rc
7030: 20 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72 69 67   = fcntl(fd_orig
7040: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a  , F_SETLK, &l);.
7050: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
7060: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
7070: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29  d, 0, sizeof(d))
7080: 3b 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b 0a 20  ;.  d.fd = fd;. 
7090: 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64   d.lock = l;.  d
70a0: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
70b0: 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61  _WRLCK;.  pthrea
70c0: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
70d0: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
70e0: 74 2c 20 26 64 29 3b 0a 20 20 70 74 68 72 65 61  t, &d);.  pthrea
70f0: 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a 20 20  d_join(t, 0);.  
7100: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 69 66 28  close(fd);.  if(
7110: 20 64 2e 72 65 73 75 6c 74 21 3d 30 20 29 20 72   d.result!=0 ) r
7120: 65 74 75 72 6e 3b 0a 20 20 74 68 72 65 61 64 73  eturn;.  threads
7130: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
7140: 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c 6f 63  rsLocks = (d.loc
7150: 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  k.l_type==F_UNLC
7160: 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  K);.}.#endif /* 
7170: 53 51 4c 49 54 45 5f 54 48 45 52 41 44 53 41 46  SQLITE_THERADSAF
7180: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
7190: 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a  inux__) */../*.*
71a0: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
71b0: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
71c0: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
71d0: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c  located by findL
71e0: 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  ockInfo()..*/.st
71f0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7200: 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74  eLockInfo(struct
7210: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
7220: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 70 4c 6f  Lock){.  if( pLo
7230: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
7240: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7250: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20   pLock->nRef==0 
7260: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
7270: 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ck->pPrev ){.   
7280: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
7290: 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ck->pPrev->pNext
72a0: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
72b0: 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d     pLock->pPrev-
72c0: 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e  >pNext = pLock->
72d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
72e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
72f0: 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c  rt( lockList==pL
7300: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 6c  ock );.        l
7310: 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d  ockList = pLock-
7320: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
7330: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d        if( pLock-
7340: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
7350: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
7360: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
7370: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  Lock );.        
7380: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50  pLock->pNext->pP
7390: 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72  rev = pLock->pPr
73a0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
73b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
73c0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Lock);.    }.  }
73d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
73e0: 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  e a unixOpenCnt 
73f0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
7400: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
7410: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
7420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7430: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
7440: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
7450: 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66  nt *pOpen){.  if
7460: 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  ( pOpen ){.    p
7470: 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Open->nRef--;.  
7480: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65    if( pOpen->nRe
7490: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
74a0: 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 29  ( pOpen->pPrev )
74b0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
74c0: 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e  ( pOpen->pPrev->
74d0: 70 4e 65 78 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a  pNext==pOpen );.
74e0: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70          pOpen->p
74f0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  Prev->pNext = pO
7500: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
7510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7520: 20 61 73 73 65 72 74 28 20 6f 70 65 6e 4c 69 73   assert( openLis
7530: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
7540: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
7550: 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Open->pNext;.   
7560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7570: 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Open->pNext ){. 
7580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7590: 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Open->pNext->pPr
75a0: 65 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  ev==pOpen );.   
75b0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78       pOpen->pNex
75c0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e  t->pPrev = pOpen
75d0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
75e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
75f0: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
7600: 69 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ing);.      sqli
7610: 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b  te3_free(pOpen);
7620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7630: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
7640: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
7650: 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  ate unixLockInfo
7660: 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74   and unixOpenCnt
7670: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
7680: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
7690: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
76a0: 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20  or.  Create new 
76b0: 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ones if necessar
76c0: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
76d0: 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62  n values might b
76e0: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
76f0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
7700: 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  rs..**.** Return
7710: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
7720: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
7730: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f  tatic int findLo
7740: 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  ckInfo(.  unixFi
7750: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
7760: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
7770: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
7780: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
7790: 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
77a0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a   unixLockInfo **
77b0: 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75  ppLock,  /* Retu
77c0: 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49  rn the unixLockI
77d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
77e0: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  re */.  struct u
77f0: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f  nixOpenCnt **ppO
7800: 70 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  pen    /* Return
7810: 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74   the unixOpenCnt
7820: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
7830: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
7860: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
7870: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
78a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
78b0: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
78c0: 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c  ct unixLockKey l
78d0: 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f  ockKey;    /* Lo
78e0: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
78f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74   unixLockInfo st
7900: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72  ructure */.  str
7910: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
7920: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
7930: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
7940: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74  e unixOpenCnt st
7950: 72 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74  ruct */.  struct
7960: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
7970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
7980: 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
7990: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  mation */.  stru
79a0: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
79b0: 2a 70 4c 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 61  *pLock;    /* Ca
79c0: 6e 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b  ndidate unixLock
79d0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Info object */. 
79e0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
79f0: 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20  Cnt *pOpen;     
7a00: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
7a10: 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20  xOpenCnt object 
7a20: 2a 2f 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  */..  /* Get low
7a30: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
7a40: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
7a50: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
7a60: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
7a70: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
7a80: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
7a90: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
7aa0: 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74  >h;.  rc = fstat
7ab0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
7ac0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7ad0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
7ae0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
7af0: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
7b00: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
7b10: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
7b20: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
7b30: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
7b40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7b50: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
7b60: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
7b70: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
7b80: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
7b90: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
7ba0: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
7bb0: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
7bc0: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
7bd0: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
7be0: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
7bf0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
7c00: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
7c10: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
7c20: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
7c30: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
7c40: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
7c50: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
7c60: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
7c70: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
7c80: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
7c90: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
7ca0: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
7cb0: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
7cc0: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
7cd0: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
7ce0: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
7cf0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
7d00: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
7d10: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
7d20: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
7d30: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
7d40: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
7d50: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
7d60: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
7d70: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
7d80: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
7d90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7da0: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
7db0: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
7dc0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
7dd0: 3d 30 20 29 7b 0a 20 20 20 20 77 72 69 74 65 28  =0 ){.    write(
7de0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20 20  fd, "S", 1);.   
7df0: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
7e00: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
7e10: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
7e20: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
7e30: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
7e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e50: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
7e60: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b  ..  memset(&lock
7e70: 4b 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  Key, 0, sizeof(l
7e80: 6f 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f 63 6b  ockKey));.  lock
7e90: 4b 65 79 2e 66 69 64 2e 64 65 76 20 3d 20 73 74  Key.fid.dev = st
7ea0: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
7eb0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6c  f OS_VXWORKS.  l
7ec0: 6f 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64 20 3d  ockKey.fid.pId =
7ed0: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
7ee0: 73 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64  se.  lockKey.fid
7ef0: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
7f00: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  t_ino;.#endif.#i
7f10: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
7f20: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
7f30: 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20  _linux__).  if( 
7f40: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
7f50: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30  achOthersLocks<0
7f60: 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65   ){.    testThre
7f70: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7f80: 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63  r(fd);.  }.  loc
7f90: 6b 4b 65 79 2e 74 69 64 20 3d 20 74 68 72 65 61  kKey.tid = threa
7fa0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
7fb0: 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20  hersLocks ? 0 : 
7fc0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
7fd0: 23 65 6e 64 69 66 0a 20 20 66 69 6c 65 49 64 20  #endif.  fileId 
7fe0: 3d 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b 0a 20  = lockKey.fid;. 
7ff0: 20 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30 20 29   if( ppLock!=0 )
8000: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f  {.    pLock = lo
8010: 63 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  ckList;.    whil
8020: 65 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63  e( pLock && memc
8030: 6d 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c  mp(&lockKey, &pL
8040: 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69  ock->lockKey, si
8050: 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 20 29  zeof(lockKey)) )
8060: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
8070: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
8080: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63    }.    if( pLoc
8090: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  k==0 ){.      pL
80a0: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ock = sqlite3_ma
80b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c  lloc( sizeof(*pL
80c0: 6f 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ock) );.      if
80d0: 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ( pLock==0 ){.  
80e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
80f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
8100: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
8110: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d  ockinfo;.      }
8120: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
8130: 63 6b 4b 65 79 20 3d 20 6c 6f 63 6b 4b 65 79 3b  ckKey = lockKey;
8140: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  .      pLock->nR
8150: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c  ef = 1;.      pL
8160: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20  ock->cnt = 0;.  
8170: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
8180: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ype = 0;.      p
8190: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f  Lock->pNext = lo
81a0: 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c  ckList;.      pL
81b0: 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ock->pPrev = 0;.
81c0: 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c 69        if( lockLi
81d0: 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70  st ) lockList->p
81e0: 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Prev = pLock;.  
81f0: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
8200: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Lock;.    }else{
8210: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  .      pLock->nR
8220: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
8230: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
8240: 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 4f 70 65  .  }.  if( ppOpe
8250: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
8260: 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20  n = openList;.  
8270: 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26    while( pOpen &
8280: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
8290: 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64  , &pOpen->fileId
82a0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
82b0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ) ){.      pOpen
82c0: 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
82d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
82e0: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
82f0: 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33   pOpen = sqlite3
8300: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
8310: 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20  *pOpen) );.     
8320: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
8330: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
8340: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
8350: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
8360: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8370: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
8380: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
8390: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d    }.      pOpen-
83a0: 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65 49 64  >fileId = fileId
83b0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
83c0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
83d0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b  Open->nLock = 0;
83e0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
83f0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
8400: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
8410: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
8420: 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e  en->pNext = open
8430: 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4f 70 65  List;.      pOpe
8440: 6e 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  n->pPrev = 0;.  
8450: 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74      if( openList
8460: 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72   ) openList->pPr
8470: 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20  ev = pOpen;.    
8480: 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70    openList = pOp
8490: 65 6e 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  en;.#if OS_VXWOR
84a0: 4b 53 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  KS.      pOpen->
84b0: 70 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pSem = NULL;.   
84c0: 20 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61     pOpen->aSemNa
84d0: 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 23 65  me[0] = '\0';.#e
84e0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
84f0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
8500: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
8510: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
8520: 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f    }..exit_findlo
8530: 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e  ckinfo:.  return
8540: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
8550: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
8560: 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  y in a different
8570: 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65   thread than the
8580: 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65   thread that the
8590: 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67  .** unixFile arg
85a0: 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f  ument belongs to
85b0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
85c0: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
85d0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65   unixFile.** ove
85e0: 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  r to the current
85f0: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8600: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c   unixFile is onl
8610: 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72  y owned by a thr
8620: 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 74  ead on systems t
8630: 68 61 74 20 75 73 65 20 4c 69 6e 75 78 54 68 72  hat use LinuxThr
8640: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65  eads..**.** Owne
8650: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
8660: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69  s only allowed i
8670: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69  f the unixFile i
8680: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
8690: 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  cked..** If the 
86a0: 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b  unixFile is lock
86b0: 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73  ed and an owners
86c0: 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68  hip is wrong, th
86d0: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  en return.** SQL
86e0: 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c  ITE_MISUSE.  SQL
86f0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8700: 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
8710: 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53   works..*/.#if S
8720: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
8730: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
8740: 6e 75 78 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  nux__).static in
8750: 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  t transferOwners
8760: 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  hip(unixFile *pF
8770: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
8780: 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c    pthread_t hSel
8790: 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73  f;.  if( threads
87a0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
87b0: 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f  rsLocks ){.    /
87c0: 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  * Ownership tran
87d0: 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64  sfers not needed
87e0: 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20   on this system 
87f0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
8800: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68  LITE_OK;.  }.  h
8810: 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73  Self = pthread_s
8820: 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68  elf();.  if( pth
8830: 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65  read_equal(pFile
8840: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b  ->tid, hSelf) ){
8850: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73  .    /* We are s
8860: 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65  till in the same
8870: 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f   thread */.    O
8880: 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e  STRACE1("No-tran
8890: 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61  sfer, same threa
88a0: 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  d\n");.    retur
88b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
88c0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
88d0: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
88e0: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e  ){.    /* We can
88f0: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72  not change owner
8900: 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72  ship while we ar
8910: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  e holding a lock
8920: 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ! */.    return 
8930: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
8940: 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54   }.  OSTRACE4("T
8950: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
8960: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
8970: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
8980: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
8990: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
89a0: 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64  f);.  pFile->tid
89b0: 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28   = hSelf;.  if (
89c0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20  pFile->pLock != 
89d0: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65  NULL) {.    rele
89e0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
89f0: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
8a00: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
8a10: 28 70 46 69 6c 65 2c 20 26 70 46 69 6c 65 2d 3e  (pFile, &pFile->
8a20: 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f  pLock, 0);.    O
8a30: 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
8a40: 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73   %d is now %s(%s
8a50: 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ,%d)\n", pFile->
8a60: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
8a70: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
8a80: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20  ->locktype),.   
8a90: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
8aa0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Name(pFile->pLoc
8ab0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46  k->locktype), pF
8ac0: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29  ile->pLock->cnt)
8ad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
8ae0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
8af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8b00: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f  ;.  }.}.#else  /
8b10: 2a 20 69 66 20 6e 6f 74 20 53 51 4c 49 54 45 5f  * if not SQLITE_
8b20: 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 20 20  THREADSAFE */.  
8b30: 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72  /* On single-thr
8b40: 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77  eaded builds, ow
8b50: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
8b60: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23   is a no-op */.#
8b70: 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72   define transfer
8b80: 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c  Ownership(X) SQL
8b90: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a  ITE_OK.#endif /*
8ba0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8bb0: 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  FE */.../*.** Th
8bc0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
8bd0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
8be0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
8bf0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
8c00: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
8c10: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
8c20: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
8c30: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
8c40: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
8c50: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
8c60: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
8c70: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
8c80: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
8c90: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
8ca0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
8cb0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
8cc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
8cd0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
8ce0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
8cf0: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
8d00: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
8d10: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
8d20: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
8d30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8d40: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
8d50: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
8d60: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
8d70: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
8d80: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
8d90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
8da0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
8db0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
8dc0: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
8dd0: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
8de0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
8df0: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
8e00: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
8e10: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
8e20: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
8e30: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
8e40: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
8e50: 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  ( pFile->pLock->
8e60: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
8e70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
8e80: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  rved = 1;.  }.. 
8e90: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
8ea0: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
8eb0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
8ec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  ..  */.  if( !re
8ed0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 74  served ){.    st
8ee0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
8ef0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
8f00: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
8f10: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
8f20: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
8f30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
8f40: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
8f50: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
8f60: 20 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66 63      if (-1 == fc
8f70: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
8f80: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b  GETLK, &lock)) {
8f90: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
8fa0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
8fb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
8fc0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
8fd0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
8fe0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8ff0: 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  EDLOCK);.      p
9000: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9010: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20  = tErrno;.    } 
9020: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
9030: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
9040: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
9050: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
9060: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
9070: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
9080: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
9090: 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c  d %d %d\n", pFil
90a0: 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
90b0: 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  ed);..  *pResOut
90c0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
90d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
90e0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
90f0: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
9100: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
9110: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
9120: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
9130: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
9140: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
9150: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
9160: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
9170: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
9180: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
9190: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
91a0: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
91b0: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
91c0: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
91d0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
91e0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
91f0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
9200: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
9210: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
9220: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
9230: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
9240: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
9250: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
9260: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
9270: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
9280: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
9290: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
92a0: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
92b0: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
92c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
92d0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
92e0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
92f0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
9300: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
9310: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
9320: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
9330: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
9340: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
9350: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
9360: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
9370: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
9380: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
9390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
93a0: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
93b0: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
93c0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
93d0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
93e0: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
93f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
9400: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
9410: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
9420: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
9430: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
9440: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
9450: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
9460: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
9470: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
9480: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
9490: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
94a0: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
94b0: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
94c0: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
94d0: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
94e0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
94f0: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
9500: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
9510: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
9520: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
9530: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
9540: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
9550: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
9560: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
9570: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
9580: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
9590: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
95a0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
95b0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
95c0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
95d0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
95e0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
95f0: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
9600: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
9610: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
9620: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
9630: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
9640: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
9650: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
9660: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
9670: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
9680: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
9690: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
96a0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
96b0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
96c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
96d0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
96e0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
96f0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
9700: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
9710: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
9720: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
9730: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
9740: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
9750: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
9760: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
9770: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
9780: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
9790: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
97a0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
97b0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
97c0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
97d0: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
97e0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
97f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
9800: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
9810: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
9820: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
9830: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
9840: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
9850: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
9860: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
9870: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
9880: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
9890: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
98a0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
98b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
98c0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
98d0: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
98e0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
98f0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
9900: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
9910: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
9920: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
9930: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
9940: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
9950: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
9960: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
9970: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
9980: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
9990: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
99a0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
99b0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
99c0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
99d0: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
99e0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
99f0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
9a00: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
9a10: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
9a20: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
9a30: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
9a40: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
9a50: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
9a60: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
9a70: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
9a80: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
9a90: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
9aa0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
9ab0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
9ac0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
9ad0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
9ae0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
9af0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
9b00: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
9b10: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
9b20: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
9b30: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
9b40: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
9b50: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
9b60: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
9b70: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
9b80: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
9b90: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
9ba0: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
9bb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
9bc0: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
9bd0: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
9be0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
9bf0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
9c00: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
9c10: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
9c20: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
9c30: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
9c40: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
9c50: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
9c60: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
9c70: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
9c80: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
9c90: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9ca0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72  xFile*)id;.  str
9cb0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
9cc0: 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d   *pLock = pFile-
9cd0: 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  >pLock;.  struct
9ce0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
9cf0: 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt s;..  assert(
9d00: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
9d10: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
9d20: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
9d30: 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  ) pid=%d\n", pFi
9d40: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63  le->h,.      loc
9d50: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
9d60: 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
9d70: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
9d80: 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  e),.      lockty
9d90: 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f  peName(pLock->lo
9da0: 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e  cktype), pLock->
9db0: 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b  cnt , getpid());
9dc0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
9dd0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
9de0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
9df0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
9e00: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
9e10: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
9e20: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
9e30: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
9e40: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
9e50: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9e60: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
9e70: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
9e80: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
9e90: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
9ea0: 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c  .    OSTRACE3("L
9eb0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
9ec0: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e  (already held)\n
9ed0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
9ee0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
9ef0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
9f00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9f10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
9f20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
9f30: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
9f40: 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
9f50: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9f60: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
9f70: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
9f80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9f90: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
9fa0: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
9fb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
9fc0: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
9fd0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
9fe0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9ff0: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
a000: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
a010: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
a020: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
a030: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
a040: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
a050: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
a060: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
a070: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
a080: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
a090: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
a0a0: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
a0b0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
a0c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
a0d0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
a0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a0f0: 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46    }.  pLock = pF
a100: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f  ile->pLock;..  /
a110: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
a120: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
a130: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
a140: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
a150: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
a160: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
a170: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
a180: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
a190: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
a1a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c  le->locktype!=pL
a1b0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26  ock->locktype &&
a1c0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f   .          (pLo
a1d0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
a1e0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
a1f0: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
a200: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
a210: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
a220: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
a230: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
a240: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
a250: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
a260: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
a270: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
a280: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
a290: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
a2a0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
a2b0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
a2c0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
a2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
a2f0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a300: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c  CK && .      (pL
a310: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ock->locktype==S
a320: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  HARED_LOCK || pL
a330: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ock->locktype==R
a340: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
a350: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
a360: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a370: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
a380: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a390: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
a3a0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30  rt( pLock->cnt>0
a3b0: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   );.    pFile->l
a3c0: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
a3d0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
a3e0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69  ->cnt++;.    pFi
a3f0: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
a400: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
a410: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f  _lock;.  }..  lo
a420: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a  ck.l_len = 1L;..
a430: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
a440: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f  = SEEK_SET;..  /
a450: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
a460: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
a470: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
a480: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
a490: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
a4a0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
a4b0: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
a4c0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
a4d0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
a4e0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
a4f0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
a500: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a510: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
a520: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
a530: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
a540: 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
a550: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
a560: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f  ock.l_type = (lo
a570: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
a580: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
a590: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
a5a0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
a5b0: 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66  _BYTE;.    s = f
a5c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a5d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
a5e0: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
a5f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
a600: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a610: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
a620: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
a630: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
a640: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
a650: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
a660: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
a670: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a680: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
a690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
a6a0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
a6b0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
a6c0: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
a6d0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a6e0: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
a6f0: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
a700: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
a710: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
a720: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
a730: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
a740: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
a750: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  K ){.    int tEr
a760: 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  rno = 0;.    ass
a770: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
a780: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a790: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
a7a0: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
a7b0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
a7c0: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
a7d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a7e0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
a7f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
a800: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
a810: 28 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65  (s = fcntl(pFile
a820: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a830: 6f 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  ock))==(-1) ){. 
a840: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
a850: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
a860: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
a870: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
a880: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
a890: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
a8a0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
a8b0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
a8c0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
a8d0: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63  NLCK;.    if( fc
a8e0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a8f0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30  SETLK, &lock)!=0
a900: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20   ){.      if( s 
a910: 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  != -1 ){.       
a920: 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68   /* This could h
a930: 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74  appen with a net
a940: 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20  work mount */.  
a950: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
a960: 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72  rrno; .        r
a970: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
a980: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
a990: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
a9a0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20  RR_UNLOCK); .   
a9b0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
a9c0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
a9d0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
a9e0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
a9f0: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
aa00: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
aa10: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
aa20: 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31  }.    if( s==(-1
aa30: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
aa40: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
aa50: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
aa60: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
aa70: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
aa80: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
aa90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
aaa0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
aab0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
aac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aad0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
aae0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
aaf0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70        pFile->pOp
ab00: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
ab10: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
ab20: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
ab30: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
ab40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
ab50: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b   pLock->cnt>1 ){
ab60: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
ab70: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
ab80: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
ab90: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
aba0: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
abb0: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
abc0: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
abd0: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
abe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
abf0: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
ac00: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
ac10: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
ac20: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
ac30: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
ac40: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
ac50: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
ac60: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
ac70: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
ac80: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
ac90: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
aca0: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ( 0!=pFile->lock
acb0: 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  type );.    lock
acc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
acd0: 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c  K;.    switch( l
ace0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20  ocktype ){.     
acf0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
ad00: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
ad10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
ad20: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
ad30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad40: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
ad50: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
ad60: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ad70: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
ad80: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ad90: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ada0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
adb0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
adc0: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
add0: 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c   }.    s = fcntl
ade0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
adf0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
ae00: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
ae10: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
ae20: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ae30: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ae40: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ae50: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ae60: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
ae70: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ae80: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ae90: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
aea0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
aeb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
aec0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
aed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
aee0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
aef0: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
af00: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
af10: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
af20: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
af30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
af40: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
af50: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
af60: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
af70: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
af80: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
af90: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
afa0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
afb0: 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
afc0: 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
afd0: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
afe0: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
aff0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
b000: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
b010: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
b020: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
b030: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
b040: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
b050: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
b060: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
b070: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
b080: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
b090: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
b0a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
b0b0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
b0c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b0d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
b0e0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
b0f0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
b100: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
b110: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b130: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
b140: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
b150: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
b160: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
b170: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
b180: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b190: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b1a0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
b1b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
b1c0: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a  e*)id;.  int h;.
b1d0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b1e0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
b1f0: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
b200: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
b210: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
b220: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
b230: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b240: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
b250: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
b260: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74  >pLock->cnt, get
b270: 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72  pid());..  asser
b280: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
b290: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
b2a0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b2b0: 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e<=locktype ){. 
b2c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b2d0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43  _OK;.  }.  if( C
b2e0: 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46  HECK_THREADID(pF
b2f0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ile) ){.    retu
b300: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
b310: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
b320: 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20  rMutex();.  h = 
b330: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63  pFile->h;.  pLoc
b340: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
b350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
b360: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
b370: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
b380: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
b390: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
b3a0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
b3b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
b3c0: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
b3d0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
b3e0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
b3f0: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
b400: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b410: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
b420: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b430: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b440: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b450: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
b460: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
b470: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
b480: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
b490: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
b4a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b4b0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
b4c0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
b4d0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
b4e0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
b4f0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
b500: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
b510: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
b520: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
b530: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
b540: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
b550: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
b560: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
b570: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
b580: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
b590: 20 20 20 20 20 20 20 20 7d 0a 09 09 09 09 67 6f          }.....go
b5a0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
b5b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b5c0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b5d0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
b5e0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b5f0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
b600: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
b610: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
b620: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
b630: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
b640: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
b650: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63  TE );.    if( fc
b660: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
b670: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
b680: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
b690: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
b6a0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
b6b0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
b6c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
b6d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b6e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b6f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b700: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
b710: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b720: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b730: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b740: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b750: 20 20 20 20 20 7d 0a 09 09 09 67 6f 74 6f 20 65       }....goto e
b760: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
b770: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
b780: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
b790: 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
b7a0: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a  penCnt *pOpen;..
b7b0: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
b7c0: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
b7d0: 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
b7e0: 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
b7f0: 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
b800: 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
b810: 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
b820: 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
b830: 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
b840: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
b850: 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e    */.    pLock->
b860: 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
b870: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
b880: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
b890: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b8a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
b8b0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
b8c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b8d0: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
b8e0: 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
b8f0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
b900: 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
b910: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
b920: 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
b930: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
b940: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  );.      if( fcn
b950: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
b960: 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20  lock)!=(-1) ){. 
b970: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f         pLock->lo
b980: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
b990: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b9a0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
b9b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
b9c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b9d0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b9e0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b9f0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
ba00: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
ba10: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ba20: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
ba30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ba40: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
ba50: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63          pLock->c
ba60: 6e 74 20 3d 20 31 3b 0a 09 09 09 09 67 6f 74 6f  nt = 1;.....goto
ba70: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ba80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ba90: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
baa0: 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
bab0: 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
bac0: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
bad0: 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
bae0: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
baf0: 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
bb00: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
bb10: 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
bb20: 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
bb30: 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
bb40: 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
bb50: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
bb60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb70: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
bb80: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f  >pOpen;.      pO
bb90: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  pen->nLock--;.  
bba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65      assert( pOpe
bbb0: 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  n->nLock>=0 );. 
bbc0: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e       if( pOpen->
bbd0: 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65  nLock==0 && pOpe
bbe0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b  n->nPending>0 ){
bbf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
bc00: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
bc10: 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69   i<pOpen->nPendi
bc20: 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ng; i++){.      
bc30: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 20 70 65 6e      /* close pen
bc40: 64 69 6e 67 20 66 64 73 2c 20 62 75 74 20 69 66  ding fds, but if
bc50: 20 63 6c 6f 73 69 6e 67 20 66 61 69 6c 73 20 64   closing fails d
bc60: 6f 6e 27 74 20 66 72 65 65 20 74 68 65 20 61 72  on't free the ar
bc70: 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ray.          **
bc80: 20 61 73 73 69 67 6e 20 2d 31 20 74 6f 20 74 68   assign -1 to th
bc90: 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  e successfully c
bca0: 6c 6f 73 65 64 20 64 65 73 63 72 69 70 74 6f 72  losed descriptor
bcb0: 73 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  s and record the
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72  .          ** er
bcd0: 72 6f 72 2e 20 20 54 68 65 20 6e 65 78 74 20 61  ror.  The next a
bce0: 74 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f 63 6b  ttempt to unlock
bcf0: 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e 2e   will try again.
bd00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
bd10: 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
bd20: 67 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69  g[i] < 0 ) conti
bd30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
bd40: 66 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e  f( close(pOpen->
bd50: 61 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a  aPending[i]) ){.
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
bd70: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
bd80: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
bd90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bda0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
bdb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bdc0: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
bdd0: 50 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b  Pending[i] = -1;
bde0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
bdf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
be00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
be10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
be20: 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e  lite3_free(pOpen
be30: 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20  ->aPending);.   
be40: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50         pOpen->nP
be50: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
be60: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
be70: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
be80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
be90: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
bea0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
beb0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
bec0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
bed0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
bee0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
bef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bf00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
bf10: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
bf20: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
bf30: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
bf40: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
bf50: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
bf60: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
bf70: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
bf80: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
bf90: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
bfa0: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
bfb0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
bfc0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
bfd0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
bfe0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
bff0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
c000: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
c010: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c020: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
c030: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
c040: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
c050: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
c060: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
c070: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
c080: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
c090: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
c0a0: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
c0b0: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
c0c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c0d0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
c0e0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  pFile ){.    if(
c0f0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
c100: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
c110: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
c120: 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69  >dirfd);.      i
c130: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
c140: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c150: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c160: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c170: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
c180: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
c190: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64          pFile->d
c1a0: 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d  irfd=-1;.      }
c1b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c1c0: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
c1d0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c      int err = cl
c1e0: 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ose(pFile->h);. 
c1f0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
c200: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c210: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
c220: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c230: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
c240: 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OSE;.      }.   
c250: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
c260: 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  S.    if( pFile-
c270: 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66  >pId ){.      if
c280: 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74  ( pFile->isDelet
c290: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c  e ){.        unl
c2a0: 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e  ink(pFile->pId->
c2b0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
c2c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76  .      }.      v
c2d0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
c2e0: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
c2f0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49  .      pFile->pI
c300: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  d = 0;.    }.#en
c310: 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32  dif.    OSTRACE2
c320: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
c330: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
c340: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
c350: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  );.    memset(pF
c360: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
c370: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20  nixFile));.  }. 
c380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c390: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
c3a0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
c3b0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
c3c0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
c3d0: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
c3e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
c3f0: 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
c400: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c410: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20  ixFile *)id;.   
c420: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
c430: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
c440: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
c450: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
c460: 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70  Open && pFile->p
c470: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  Open->nLock ){. 
c480: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
c490: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
c4a0: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
c4b0: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
c4c0: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
c4d0: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
c4e0: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
c4f0: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
c500: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
c510: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
c520: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
c530: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
c540: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
c550: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
c560: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
c570: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
c580: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
c590: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b        int *aNew;
c5a0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75 6e  .      struct un
c5b0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
c5c0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
c5d0: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71  .      aNew = sq
c5e0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f  lite3_realloc(pO
c5f0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28  pen->aPending, (
c600: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
c610: 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  1)*sizeof(int) )
c620: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
c630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c640: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
c650: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
c660: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
c670: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  or */.      }els
c680: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  e{.        pOpen
c690: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
c6a0: 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  w;.        pOpen
c6b0: 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e  ->aPending[pOpen
c6c0: 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46  ->nPending] = pF
c6d0: 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20  ile->h;.        
c6e0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
c6f0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  +;.        pFile
c700: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
c710: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  }.    }.    rele
c720: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
c730: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
c740: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
c750: 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  ile->pOpen);.   
c760: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
c770: 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
c780: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
c790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c7a0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
c7b0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
c7c0: 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
c7d0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
c7e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c7f0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
c800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c840: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
c850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c890: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
c8c0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
c8f0: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
c900: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
c910: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
c920: 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
c930: 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
c940: 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
c950: 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
c960: 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
c970: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
c980: 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
c990: 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
c9a0: 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
c9b0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
c9c0: 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
c9d0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
c9e0: 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
c9f0: 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
ca00: 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
ca10: 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
ca20: 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
ca30: 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
ca40: 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
ca50: 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
ca60: 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
ca70: 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
ca80: 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
ca90: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
caa0: 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
cab0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
cac0: 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
cad0: 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
cae0: 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
caf0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
cb00: 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
cb10: 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
cb20: 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
cb30: 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
cb40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
cb50: 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
cb60: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
cb70: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
cb80: 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
cb90: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
cba0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
cbb0: 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
cbc0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
cbd0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
cbe0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
cbf0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
cc00: 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
cc10: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
cc20: 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
cc30: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
cc40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
cc50: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
cc60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
cc70: 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
cc80: 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
cc90: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
cca0: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
ccb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ccc0: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
ccd0: 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
cce0: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
ccf0: 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
cd00: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
cd10: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
cd20: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
cd30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cd40: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
cd50: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
cd60: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
cd70: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
cd80: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
cd90: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
cda0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
cdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
cdc0: 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
cdd0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
cde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdf0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
ce00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce40: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
ce50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce90: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ceb0: 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
cec0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cee0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
cef0: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
cf00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
cf10: 73 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  ses the existing
cf20: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
cf30: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
cf40: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
cf50: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
cf60: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
cf70: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
cf80: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
cf90: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
cfa0: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
cfb0: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
cfc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
cfd0: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
cfe0: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
cff0: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
d000: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
d010: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
d020: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
d030: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
d040: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
d050: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
d060: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
d070: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
d080: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
d090: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
d0a0: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
d0b0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
d0c0: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
d0d0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
d0e0: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
d0f0: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
d100: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
d110: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
d120: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
d130: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
d140: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
d150: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
d160: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
d170: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
d180: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
d190: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
d1a0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
d1b0: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
d1c0: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
d1d0: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
d1e0: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
d1f0: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
d200: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
d210: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
d220: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
d230: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
d240: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
d250: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
d260: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
d270: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
d280: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
d290: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
d2a0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
d2b0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
d2c0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
d2d0: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
d2e0: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
d2f0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
d300: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
d310: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
d320: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
d330: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
d340: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
d350: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
d360: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
d370: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
d380: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
d390: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
d3a0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
d3b0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
d3c0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
d3d0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
d3e0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
d3f0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
d400: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
d410: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
d420: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
d430: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
d440: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
d450: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
d460: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
d470: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
d480: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
d490: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
d4a0: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
d4b0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
d4c0: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
d4d0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
d4e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
d4f0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
d500: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
d510: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
d520: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
d530: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d540: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
d550: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d560: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d570: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
d580: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
d590: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
d5a0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
d5b0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
d5c0: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
d5d0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
d5e0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
d5f0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
d600: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
d610: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
d620: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  ED_LOCK ){.    /
d630: 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f  * Either this co
d640: 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65  nnection or some
d650: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
d660: 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  n in the same pr
d670: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c  ocess.    ** hol
d680: 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ds a lock on the
d690: 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20   file.  No need 
d6a0: 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72  to check further
d6b0: 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65  . */.    reserve
d6c0: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
d6d0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20      /* The lock 
d6e0: 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f  is held if and o
d6f0: 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66  nly if the lockf
d700: 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
d710: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
d720: 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74  ockFile = (const
d730: 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
d740: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
d750: 20 20 72 65 73 65 72 76 65 64 20 3d 20 61 63 63    reserved = acc
d760: 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  ess(zLockFile, 0
d770: 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  )==0;.  }.  OSTR
d780: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
d790: 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  CK %d %d %d\n", 
d7a0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
d7b0: 73 65 72 76 65 64 29 3b 0a 20 20 2a 70 52 65 73  served);.  *pRes
d7c0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
d7d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d7e0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
d7f0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
d800: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
d810: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
d820: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
d830: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
d840: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
d850: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
d860: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
d870: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
d880: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
d890: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
d8a0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
d8b0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
d8c0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
d8d0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
d8e0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
d8f0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
d900: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
d910: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
d920: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
d930: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
d940: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
d950: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
d960: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
d970: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
d980: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
d990: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
d9a0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
d9b0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
d9c0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
d9d0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
d9e0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
d9f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
da00: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
da10: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
da20: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
da30: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
da40: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
da50: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
da60: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
da70: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
da80: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
da90: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
daa0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
dab0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
dac0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
dad0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
dae0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
daf0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
db00: 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
db10: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
db20: 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
db30: 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
db40: 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
db50: 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
db60: 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
db70: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
db80: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
db90: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
dba0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
dbb0: 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
dbc0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
dbd0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
dbe0: 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
dbf0: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
dc00: 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
dc10: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
dc20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
dc30: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
dc40: 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
dc50: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
dc60: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
dc70: 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
dc80: 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
dc90: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
dca0: 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
dcb0: 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
dcc0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
dcd0: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  pe > NO_LOCK ){.
dce0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
dcf0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
dd00: 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
dd10: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
dd20: 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
dd30: 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
dd40: 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73  le */.    utimes
dd50: 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
dd60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
dd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dd80: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
dd90: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
dda0: 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  ck */.  fd = ope
ddb0: 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
ddc0: 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
ddd0: 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
dde0: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
ddf0: 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
de00: 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
de10: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
de20: 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
de30: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
de40: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
de50: 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
de60: 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
de70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
de80: 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
de90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
dea0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
deb0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
dec0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ded0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
dee0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
def0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
df00: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
df10: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
df20: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
df30: 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f  ;.  } .  if( clo
df40: 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46  se(fd) ){.    pF
df50: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
df60: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
df70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
df80: 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  OSE;.  }.  .  /*
df90: 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
dfa0: 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
dfb0: 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
dfc0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
dfd0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
dfe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
dff0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e000: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
e010: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
e020: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
e030: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
e040: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
e050: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
e060: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
e070: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
e080: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e090: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
e0a0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
e0b0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
e0c0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
e0d0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
e0e0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f  *.** When the lo
e0f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63  cking level reac
e100: 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c  hes NO_LOCK, del
e110: 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
e120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e130: 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73   dotlockUnlock(s
e140: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
e150: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
e160: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e170: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e180: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
e190: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
e1a0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
e1b0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
e1c0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
e1d0: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
e1e0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
e1f0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
e200: 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
e210: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
e220: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
e230: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
e240: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
e250: 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
e260: 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
e270: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e280: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
e290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
e2b0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
e2c0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
e2d0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
e2e0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
e2f0: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
e300: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
e310: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
e320: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
e330: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
e340: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e350: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e360: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e380: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e390: 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
e3a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
e3b0: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
e3c0: 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
e3d0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
e3e0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
e3f0: 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
e400: 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
e410: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e420: 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
e430: 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
e440: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e450: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e460: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e470: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
e480: 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
e490: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e4a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e4b0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e4c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
e4d0: 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
e4e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
e4f0: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
e500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e510: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
e520: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
e530: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
e540: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
e550: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
e560: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
e570: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
e580: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
e590: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
e5a0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e5b0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e5c0: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
e5d0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
e5e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
e5f0: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
e600: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
e610: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
e620: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
e630: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
e640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
e650: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
e660: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
e670: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
e680: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
e750: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e770: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
e780: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
e790: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
e7a0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
e7b0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
e7c0: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
e7d0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
e7e0: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
e7f0: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
e800: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
e810: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
e820: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
e830: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
e840: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
e850: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
e860: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
e870: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
e880: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
e890: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
e8a0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
e8b0: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
e8c0: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
e8d0: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
e8e0: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
e8f0: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
e900: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
e910: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
e920: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
e930: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
e940: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
e950: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
e960: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
e970: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
e980: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
e990: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
e9a0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
e9b0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
e9c0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
e9d0: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
e9e0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
e9f0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
ea00: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
ea10: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
ea20: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
ea30: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
ea40: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
ea50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
ea60: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
ea70: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
ea80: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
ea90: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
eaa0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
eab0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
eac0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
ead0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
eae0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
eaf0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
eb00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
eb10: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
eb20: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
eb30: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
eb40: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
eb50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
eb60: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
eb70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
eb80: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
eb90: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
eba0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
ebb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
ebc0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
ebd0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
ebe0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
ebf0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
ec00: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
ec10: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
ec20: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
ec30: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
ec40: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ec50: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
ec60: 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
ec70: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
ec80: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
ec90: 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
eca0: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
ecb0: 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
ecc0: 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
ecd0: 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66  .    int lrc = f
ece0: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
ecf0: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
ed00: 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
ed10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
ed20: 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
ed30: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
ed40: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
ed50: 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
ed60: 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
ed70: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
ed80: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ed90: 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
eda0: 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
edb0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72  or */.        lr
edc0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
edd0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ede0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
edf0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20  RR_UNLOCK); .   
ee00: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ee10: 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
ee20: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
ee30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
ee40: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
ee50: 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
ee60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
ee70: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
ee80: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ee90: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
eea0: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
eeb0: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
eec0: 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
eed0: 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
eee0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
eef0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
ef00: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
ef10: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
ef20: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
ef30: 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
ef40: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ef50: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
ef60: 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
ef70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ef80: 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
ef90: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
efa0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
efb0: 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 23  c, reserved);..#
efc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
efd0: 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
efe0: 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
eff0: 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
f000: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
f010: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f020: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
f030: 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
f040: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
f050: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
f060: 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
f070: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
f080: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f090: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
f0a0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
f0b0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
f0c0: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
f0d0: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
f0e0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
f0f0: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
f100: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
f110: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
f120: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
f130: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
f140: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
f150: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
f160: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
f170: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
f180: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
f190: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
f1a0: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
f1b0: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
f1c0: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
f1d0: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
f1e0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
f1f0: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
f200: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
f210: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
f220: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
f230: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
f240: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
f250: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
f260: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
f270: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
f280: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
f290: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
f2a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
f2b0: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
f2c0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
f2d0: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
f2e0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f2f0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f300: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
f310: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
f320: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
f330: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
f340: 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
f350: 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
f360: 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
f370: 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
f380: 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
f390: 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
f3a0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
f3b0: 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
f3c0: 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
f3d0: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
f3e0: 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
f3f0: 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
f400: 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
f410: 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
f420: 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
f430: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f440: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
f450: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
f460: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
f470: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
f480: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
f490: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
f4a0: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
f4b0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f4c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
f4d0: 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pe) {.  int rc =
f4e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
f4f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f500: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
f510: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
f520: 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
f530: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
f540: 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
f550: 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
f560: 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
f570: 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
f580: 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
f590: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e  File->locktype >
f5a0: 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
f5b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
f5c0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
f5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f5e0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
f5f0: 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
f600: 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
f610: 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  (flock(pFile->h,
f620: 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
f630: 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
f640: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f650: 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
f660: 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
f670: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
f680: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f690: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f6a0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
f6b0: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
f6c0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f6d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f6e0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
f6f0: 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
f700: 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
f710: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
f720: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
f730: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f740: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
f750: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
f760: 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22  K    %d %s %s\n"
f770: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
f780: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
f790: 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  e), .           
f7a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
f7b0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
f7c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f7d0: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
f7e0: 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
f7f0: 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
f800: 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
f810: 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
f820: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
f830: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f840: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
f850: 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
f860: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
f870: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
f880: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
f890: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
f8a0: 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
f8b0: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
f8c0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
f8d0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
f8e0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
f8f0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
f900: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
f910: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
f920: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
f930: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
f940: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
f950: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
f960: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
f970: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
f980: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f990: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
f9a0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f9b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f9c0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
f9d0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
f9e0: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
f9f0: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
fa00: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
fa10: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
fa20: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
fa30: 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
fa40: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  ));.  assert( lo
fa50: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
fa60: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
fa70: 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
fa80: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
fa90: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
faa0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
fab0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fac0: 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
fad0: 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
fae0: 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
faf0: 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
fb00: 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
fb10: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
fb20: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
fb30: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fb40: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
fb50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fb60: 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
fb70: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
fb80: 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28   int rc = flock(
fb90: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
fba0: 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a  N);.  if (rc) {.
fbb0: 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e      int r, tErrn
fbc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
fbd0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fbe0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fbf0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fc00: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
fc10: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fc20: 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  (r) ){.      pFi
fc30: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
fc40: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69  tErrno;.    }.#i
fc50: 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
fc60: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
fc70: 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72 20  RORS.    if( (r 
fc80: 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
fc90: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
fca0: 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c  ){.      r = SQL
fcb0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
fcc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fcd0: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
fce0: 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
fcf0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a   .    return r;.
fd00: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70    } else {.    p
fd10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fd20: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
fd30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fd40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
fd50: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
fd60: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
fd70: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
fd80: 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
fd90: 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c   ){.    flockUnl
fda0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
fdb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
fdc0: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
fdd0: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
fde0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
fdf0: 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
fe00: 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
fe10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe20: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
fe30: 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
fe40: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
fe50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
fe60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
ff20: 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
ff30: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ff50: 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
ff60: 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
ff70: 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
ff80: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
ff90: 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
ffa0: 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
ffb0: 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
ffc0: 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
ffd0: 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
ffe0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
fff0: 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
10000 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
10010 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
10020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10030 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
10040 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
10050 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
10060 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
10070 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10080 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
10090 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
100a0 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
100b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
100c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
100d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
100e0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
100f0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10100 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
10110 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
10120 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
10130 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
10140 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
10150 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
10160 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
10170 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
10180 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
10190 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
101a0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
101b0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
101c0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
101d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
101e0 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
101f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10200 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
10210 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
10220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
10230 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
10240 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10250 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10260 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
10270 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10280 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10290 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
102a0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
102b0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
102c0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
102d0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
102e0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
102f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10300 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
10310 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
10320 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
10330 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
10340 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
10350 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
10360 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
10370 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
10380 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
10390 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b  le->pOpen->pSem;
103a0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
103b0 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
103c0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
103d0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
103e0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
103f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
10400 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
10410 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10420 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10430 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10440 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10450 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
10460 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
10470 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10480 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
10490 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
104a0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
104b0 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
104c0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
104d0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
104e0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
104f0 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45  locktype < SHARE
10500 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
10510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10520 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
10530 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
10540 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
10550 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
10560 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
10570 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
10580 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  %d %d %d\n", pFi
10590 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
105a0 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ved);..  *pResOu
105b0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
105c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
105d0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
105e0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
105f0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10600 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
10610 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
10620 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
10630 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
10640 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
10650 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
10660 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
10670 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
10680 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
10690 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
106a0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
106b0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
106c0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
106d0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
106e0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
106f0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
10700 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
10710 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
10720 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
10730 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
10740 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
10750 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
10760 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
10770 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
10780 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
10790 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
107a0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
107b0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
107c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
107d0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
107e0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
107f0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
10800 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
10810 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
10820 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10830 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10840 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
10850 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
10860 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
10870 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
10880 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
10890 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
108a0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
108b0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
108c0 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
108d0 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
108e0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
108f0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
10900 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
10910 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
10920 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
10930 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
10940 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
10950 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
10960 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
10970 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
10980 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
10990 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
109a0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
109b0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
109c0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
109d0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
109e0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
109f0 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   semLock(sqlite3
10a00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
10a10 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
10a20 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10a30 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10a40 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20  int fd;.  sem_t 
10a50 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
10a60 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  Open->pSem;.  in
10a70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10a80 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
10a90 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
10aa0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
10ab0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
10ac0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
10ad0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
10ae0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
10af0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20  ile->locktype > 
10b00 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
10b10 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
10b20 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
10b30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10b40 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
10b50 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
10b60 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
10b70 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
10b80 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
10b90 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
10ba0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
10bb0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
10bc0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10bd0 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
10be0 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
10bf0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
10c00 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
10c10 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c  ok */.  pFile->l
10c20 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
10c30 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  pe;.. sem_end_lo
10c40 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
10c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
10c60 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10c70 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
10c80 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
10c90 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
10ca0 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
10cb0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
10cc0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
10cd0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
10ce0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
10cf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10d00 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
10d10 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
10d20 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
10d30 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
10d40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
10d50 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55  .static int semU
10d60 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10d70 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
10d80 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
10d90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10da0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
10db0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
10dc0 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a  ->pOpen->pSem;..
10dd0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
10df0 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  m );.  OSTRACE5(
10e00 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
10e10 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  as %d pid=%d\n",
10e20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
10e30 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
10e40 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
10e50 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
10e60 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
10e70 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
10e80 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
10e90 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
10ea0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
10eb0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
10ec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10ed0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10ee0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
10ef0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
10f00 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
10f10 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
10f20 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
10f30 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10f40 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
10f50 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
10f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10f70 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
10f80 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
10f90 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
10fa0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
10fb0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
10fc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
10fd0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10fe0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10ff0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11000 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
11010 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11020 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
11030 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11040 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
11050 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
11060 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
11070 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
11080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11090 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
110a0 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
110b0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
110c0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
110d0 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
110e0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
110f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11100 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
11110 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11120 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
11130 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
11140 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
11150 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
11160 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
11170 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
11180 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
11190 6e 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  n);.    closeUni
111a0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
111b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
111c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
111d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
111e0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
111f0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
11200 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
11210 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
11220 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
11230 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11240 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
11250 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
11260 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
11270 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
11280 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112d0 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
112e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11320 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11340 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
11350 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
11380 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
11390 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
113a0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
113b0 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
113c0 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
113d0 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
113e0 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
113f0 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
11400 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
11410 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
11420 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
11430 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
11440 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
11450 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
11460 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
11470 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
11480 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
11490 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
114a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
114b0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
114c0 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
114d0 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
114e0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
114f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
11500 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
11510 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
11520 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
11530 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
11540 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a 20  ng sharedByte;. 
11550 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
11560 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
11570 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11580 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
11590 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
115a0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
115b0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
115c0 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
115d0 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
115e0 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
115f0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
11600 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
11610 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
11620 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
11630 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
11640 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
11650 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
11660 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
11670 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
11680 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
11690 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
116a0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
116b0 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
116c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
116d0 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
116e0 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
116f0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
11700 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
11710 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
11740 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
11750 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
11760 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
11770 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
11780 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
11790 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
117a0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
117b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
117c0 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
117d0 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
117e0 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
117f0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
11800 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
11810 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11820 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
11830 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
11840 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
11850 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
11860 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
11870 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
11880 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
11890 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
118a0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
118b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
118c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
118d0 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
118e0 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
118f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
11900 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
11910 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
11920 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
11930 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
11940 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
11950 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11960 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
11970 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
11980 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
11990 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
119a0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
119b0 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
119c0 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
119d0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
119e0 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
119f0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
11a00 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
11a10 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
11a20 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
11a30 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
11a40 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
11a50 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
11a60 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
11a70 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50  .  OSTRACE6("AFP
11a80 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
11a90 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
11aa0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
11ab0 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
11ac0 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
11ad0 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
11ae0 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
11af0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
11b00 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
11b10 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
11b20 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
11b30 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
11b40 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
11b50 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
11b60 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11b70 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
11b80 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE4("AFPSETLOCK 
11b90 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
11ba0 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
11bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
11bc0 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
11bd0 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23  rror(tErrno));.#
11be0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11bf0 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
11c00 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
11c10 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
11c20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11c30 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11c40 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11c60 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
11c70 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
11c80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11c90 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
11ca0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
11cb0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
11cc0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
11cd0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11ce0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11cf0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11d00 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11d10 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
11d20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11d30 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
11d40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11d50 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
11d60 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11d70 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11d80 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11d90 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11da0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11db0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11dc0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11dd0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11de0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11df0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11e00 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11e10 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11e20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11e30 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11e40 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11e50 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11e60 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
11e70 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
11e80 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
11e90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11ea0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11eb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11ec0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11ed0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11ee0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11ef0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
11f00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11f20 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11f30 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11f40 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11f50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
11f60 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
11f70 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11f80 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
11f90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
11fa0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
11fb0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11fc0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11fd0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11fe0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
11ff0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
12000 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
12010 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
12020 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
12030 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
12040 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
12050 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
12060 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
12070 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
12080 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
12090 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
120a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
120b0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
120c0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
120d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
120e0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
120f0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
12100 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
12110 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
12120 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
12130 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
12140 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
12150 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
12160 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
12170 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12180 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
12190 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
121a0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
121b0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
121c0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
121d0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
121e0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
121f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
12210 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
12220 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
12230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
12240 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
12250 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
12260 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12270 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a  , reserved);.  .
12280 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12290 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
122a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
122b0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
122c0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
122d0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
122e0 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
122f0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12300 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12310 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12320 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12330 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12340 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12350 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12360 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12370 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
12380 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
12390 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
123a0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
123b0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
123c0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
123d0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
123e0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
123f0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12400 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12410 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12420 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12430 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12440 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12450 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12460 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12470 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
12480 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
12490 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
124a0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
124b0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
124c0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
124d0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
124e0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
124f0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12500 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12510 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12520 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12530 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12540 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12550 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
12560 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12570 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12580 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12590 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
125a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
125b0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
125c0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
125d0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
125e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
125f0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
12600 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12610 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12620 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12630 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
12640 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
12650 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
12660 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
12670 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
12680 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
12690 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
126a0 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
126b0 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64  %s was %s pid=%d
126c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
126d0 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
126e0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
126f0 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
12700 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67  le->locktype), g
12710 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20  etpid());..  /* 
12720 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
12730 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
12740 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
12750 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
12760 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
12770 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
12780 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
12790 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
127a0 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
127b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
127c0 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
127d0 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
127e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
127f0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
12800 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
12810 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
12820 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
12830 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
12840 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
12850 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
12860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12870 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
12880 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
12890 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
128a0 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
128b0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
128c0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
128d0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
128e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
128f0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
12900 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
12910 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
12920 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
12930 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
12940 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
12950 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
12960 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
12970 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
12980 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
12990 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
129a0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
129b0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
129c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
129d0 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
129e0 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
129f0 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
12a00 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
12a10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69  TE_OK ){.    uni
12a30 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
12a40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12a50 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
12a60 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
12a70 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
12a80 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
12a90 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
12aa0 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
12ab0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
12ac0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
12ad0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
12ae0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
12af0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
12b00 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
12b10 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
12b20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
12b30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
12b40 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
12b50 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
12b60 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
12b70 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
12b80 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
12b90 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
12ba0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
12bb0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
12bc0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
12bd0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
12be0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
12bf0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
12c00 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
12c10 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
12c20 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
12c30 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
12c40 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
12c50 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
12c60 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
12c70 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
12c80 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
12c90 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
12ca0 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63  .    int lk, lrc
12cb0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
12cc0 6e 6f 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  no;.    .    /* 
12cd0 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
12ce0 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
12cf0 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
12d00 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
12d10 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
12d20 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
12d30 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
12d40 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
12d50 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  ); .    context-
12d60 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
12d70 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
12d80 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
12d90 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
12da0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
12db0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
12dc0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
12dd0 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74  ED_FIRST+context
12de0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
12df0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
12e00 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
12e10 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
12e20 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
12e30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
12e40 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
12e50 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
12e60 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
12e70 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12e80 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12e90 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
12ea0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
12eb0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12ec0 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
12ed0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12ee0 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
12ef0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
12f00 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
12f10 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
12f20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
12f30 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
12f40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
12f50 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
12f60 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
12f70 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
12f80 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
12f90 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
12fa0 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
12fb0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
12fc0 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
12fd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
12fe0 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
12ff0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
13000 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
13010 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
13020 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
13030 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
13040 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
13050 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
13060 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
13070 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
13080 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
13090 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
130a0 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
130b0 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
130c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
130d0 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
130e0 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
130f0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
13100 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
13110 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
13120 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
13130 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
13140 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
13150 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13160 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13170 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
13180 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
13190 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
131a0 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
131b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
131c0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
131d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
131e0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
131f0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
13200 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
13210 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
13220 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
13230 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
13240 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
13250 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
13260 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
13270 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
13280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
13290 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
132a0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
132b0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
132c0 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
132f0 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
13300 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
13310 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
13320 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
13330 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
13340 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
13350 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
13360 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
13370 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13380 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13390 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
133a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
133d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
133e0 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
133f0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13400 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13410 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
13430 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
13440 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
13450 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
13460 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
13470 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
13480 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
13490 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
134a0 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
134b0 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
134c0 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
134d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
134e0 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
134f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13500 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
13510 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
13520 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13530 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
13540 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
13550 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
13560 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
13570 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13580 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
13590 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
135a0 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
135b0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
135c0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
135d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
135e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
135f0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
13600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
13610 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
13620 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
13630 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
13640 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
13650 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
13660 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
13670 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
13680 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
13690 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
136a0 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
136b0 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
136c0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
136d0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
136e0 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
136f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
13700 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13710 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
13720 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
13730 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
13740 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
13750 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
13760 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
13770 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
13780 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
13790 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
137a0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
137b0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
137c0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
137d0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
137e0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
137f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
13800 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13810 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
13820 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72  ktype) {.  int r
13830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13840 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13850 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13860 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
13870 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 61  ntext *pCtx = (a
13880 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13890 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
138a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
138b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
138c0 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
138d0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
138e0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
138f0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
13900 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
13910 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
13920 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
13930 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
13940 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
13950 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
13960 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
13970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13980 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
13990 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
139a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
139b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
139c0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
139d0 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
139e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
139f0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a  ED_LOCK ){.    .
13a00 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
13a10 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
13a20 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
13a30 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
13a40 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
13a50 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
13a60 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
13a70 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
13a80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13a90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
13aa0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
13ab0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
13ac0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
13ad0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
13ae0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
13af0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
13b00 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
13b10 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65  pCtx->sharedByte
13b20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
13b30 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  fpSetLock(pCtx->
13b40 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
13b50 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
13b60 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
13b70 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
13b80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
13b90 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  le->locktype>=PE
13ba0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
13bb0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13bc0 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
13bd0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
13be0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
13bf0 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
13c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
13c10 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
13c20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13c30 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13c40 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
13c50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
13c60 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
13c70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
13c80 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
13c90 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63  LOCK ){.    /* c
13ca0 6c 65 61 72 20 74 68 65 20 73 68 61 72 65 64 20  lear the shared 
13cb0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
13cc0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
13cd0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43   SHARED_FIRST+pC
13ce0 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  tx->sharedByte;.
13cf0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13d00 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
13d10 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
13d20 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
13d30 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
13d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13d50 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
13d60 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73  _LOCK ){.      s
13d70 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
13d80 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
13d90 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70  ->pOpen;.      p
13da0 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
13db0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
13dc0 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
13dd0 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
13de0 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
13df0 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
13e00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
13e10 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
13e20 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ; i<pOpen->nPend
13e30 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ing; i++){.     
13e40 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e       if( pOpen->
13e50 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20  aPending[i] < 0 
13e60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13e70 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
13e80 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
13e90 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
13ea0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13eb0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13ec0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
13ed0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
13ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
13ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
13f00 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
13f10 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  ] = -1;.        
13f20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
13f30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13f40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f60 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
13f70 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  g);.          pO
13f80 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
13f90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  0;.          pOp
13fa0 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
13fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13fc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13fd0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13fe0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
13ff0 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c  TE_OK ) pFile->l
14000 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
14010 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
14020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
14030 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
14040 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
14050 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
14060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
14070 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14080 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
14090 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
140a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
140b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
140c0 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
140d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
140e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
140f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
14100 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
14110 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
14120 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
14130 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
14140 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
14150 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
14160 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
14170 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
14180 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
14190 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
141a0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
141b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
141c0 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
141d0 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
141e0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
141f0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
14200 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
14210 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
14220 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
14230 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20     int *aNew;.  
14240 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
14250 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
14260 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
14270 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
14280 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70 65 6e  e3_realloc(pOpen
14290 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70  ->aPending, (pOp
142a0 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a  en->nPending+1)*
142b0 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20  sizeof(int) );. 
142c0 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
142d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
142e0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
142f0 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20  , just leak the 
14300 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14310 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
14320 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
14330 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a  Pending = aNew;.
14340 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
14350 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e  Pending[pOpen->n
14360 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65  Pending] = pFile
14370 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ->h;.        pOp
14380 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a  en->nPending++;.
14390 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
143a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
143b0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
143c0 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70  OpenCnt(pFile->p
143d0 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  Open);.    sqlit
143e0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
143f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
14400 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
14410 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
14420 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
14430 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14440 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
14450 2a 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  * defined(__DARW
14460 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  IN__) && SQLITE_
14470 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
14480 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
14490 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
144a0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
144b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
144c0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
144d0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
144e0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
144f0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14500 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14510 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14520 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
14530 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
14540 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
14550 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
14560 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
14570 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14590 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
145a0 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
145b0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
14680 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  Non-locking sqli
14690 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
146a0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
146c0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69  *.** The next di
146d0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
146e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
146f0 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20  for all methods 
14700 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  of the .** sqlit
14710 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f  e3_file object o
14720 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  ther than the lo
14730 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20  cking methods.  
14740 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d  The locking.** m
14750 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69  ethods were defi
14760 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73  ned in divisions
14770 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b   above (one lock
14780 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a  ing method per.*
14790 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68  * division).  Th
147a0 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  ose methods that
147b0 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   are common to a
147c0 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73  ll locking modes
147d0 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74  .** are gather t
147e0 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69  ogether into thi
147f0 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a  s division..*/..
14800 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
14810 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
14820 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14830 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
14840 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
14850 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
14860 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14870 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
14880 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
14890 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
148a0 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
148b0 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
148c0 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
148d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
148e0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
148f0 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
14900 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
14910 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
14920 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
14930 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
14940 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
14950 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72  D.** any any for
14960 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
14970 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
14980 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
14990 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
149a0 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
149b0 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
149c0 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
149d0 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
149e0 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
149f0 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
14a00 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
14a10 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
14a20 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
14a30 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
14a40 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
14a50 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
14a60 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
14a70 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
14a80 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
14a90 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
14aa0 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
14ab0 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
14ac0 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
14ad0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
14ae0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
14af0 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
14b00 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
14b10 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
14b20 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d  ot = pread64(id-
14b30 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
14b40 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
14b50 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
14b60 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
14b70 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
14b80 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
14b90 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
14ba0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
14bb0 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
14bc0 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
14bd0 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
14be0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
14bf0 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
14c00 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
14c10 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
14c30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
14c40 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
14c50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14c60 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
14c70 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
14c80 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
14c90 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
14ca0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
14cb0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
14cc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
14cd0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  rno;.  }.  OSTRA
14ce0 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE5("READ    %-3
14cf0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
14d00 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
14d10 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
14d20 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72  LAPSED);.  retur
14d30 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
14d40 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
14d50 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
14d60 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
14d70 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
14d80 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
14d90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
14da0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
14db0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
14dc0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
14dd0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
14de0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
14df0 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
14e00 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
14e10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
14e20 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74   offset.){.  int
14e30 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
14e40 69 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65  id );.  got = se
14e50 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
14e60 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c  ile*)id, offset,
14e70 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
14e80 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
14e90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14ea0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
14eb0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a   got<0 ){.    /*
14ec0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
14ed0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
14ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14ef0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
14f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e   }else{.    ((un
14f10 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
14f20 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
14f30 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
14f40 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65  r */.    /* Unre
14f50 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
14f60 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
14f70 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
14f80 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
14f90 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
14fa0 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
14fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14fc0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
14fd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b   }.}../*.** Seek
14fe0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
14ff0 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
15000 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
15010 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
15020 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15030 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
15040 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
15050 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
15060 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
15070 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
15080 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
15090 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
150a0 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
150b0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
150c0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
150d0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
150e0 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
150f0 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
15100 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
15110 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
15120 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
15130 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
15140 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
15150 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
15160 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20  = pwrite(id->h, 
15170 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
15180 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  t);.#elif define
15190 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
151a0 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28   got = pwrite64(
151b0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
151c0 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65  , offset);.#else
151d0 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
151e0 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
151f0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
15200 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
15210 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
15220 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
15230 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
15240 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15250 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15270 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15280 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
15290 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
152a0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f  urn -1;.  }.  go
152b0 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c  t = write(id->h,
152c0 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
152d0 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
152e0 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
152f0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
15300 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15310 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
15320 53 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20  STRACE5("WRITE  
15330 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
15340 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
15350 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
15360 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
15370 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
15380 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
15390 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
153a0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
153b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
153c0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
153d0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
153e0 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
153f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
15400 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
15410 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
15420 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
15430 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
15440 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
15450 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77  fset .){.  int w
15460 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
15470 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
15480 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77  rt( amt>0 );.  w
15490 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
154a0 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
154b0 72 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  rite((unixFile*)
154c0 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  id, offset, pBuf
154d0 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
154e0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
154f0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
15500 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
15510 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
15520 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
15530 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
15540 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
15550 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
15560 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
15570 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
15580 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
15590 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
155a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
155b0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
155c0 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
155d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
155e0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
155f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
15600 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
15610 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
15620 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
15630 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
15640 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
15650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15670 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15680 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
15690 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
156a0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
156b0 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
156c0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
156d0 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
156e0 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
156f0 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
15700 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
15710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
15720 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
15730 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
15740 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
15750 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
15760 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28 29   the fdatasync()
15770 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65   API only if the
15780 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20   HAVE_FDATASYNC 
15790 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
157a0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ..** Otherwise u
157b0 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74  se fsync() in it
157c0 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  s place..*/.#ifn
157d0 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53 59  def HAVE_FDATASY
157e0 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  NC.# define fdat
157f0 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
15800 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
15810 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
15820 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
15830 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
15840 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
15850 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
15860 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
15870 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
15880 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
15890 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
158a0 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
158b0 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
158c0 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
158d0 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
158e0 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
158f0 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
15900 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
15910 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
15920 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
15930 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
15940 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
15950 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
15960 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
15970 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
15980 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
15990 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
159a0 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
159b0 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
159c0 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
159d0 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
159e0 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
159f0 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
15a00 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
15a10 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
15a20 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
15a30 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
15a40 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
15a50 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
15a60 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
15a70 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
15a80 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
15a90 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
15aa0 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
15ab0 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
15ac0 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
15ad0 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
15ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15b00 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
15b10 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
15b20 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
15b30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15b40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
15b50 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
15b60 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
15b70 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
15b80 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
15b90 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
15ba0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
15bb0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
15bc0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
15bd0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
15be0 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
15bf0 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
15c00 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
15c10 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
15c20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
15c30 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
15c40 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
15c50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
15c60 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
15c70 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
15c80 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
15c90 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
15ca0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
15cb0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
15cc0 53 79 6e 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Sync);.#endif.. 
15cd0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
15ce0 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
15cf0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
15d00 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
15d10 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
15d20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
15d30 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
15d40 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
15d50 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
15d60 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
15d70 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
15d80 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
15d90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
15da0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
15db0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
15dc0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
15dd0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
15de0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
15df0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
15e00 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
15e10 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
15e20 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
15e30 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
15e40 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
15e50 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
15e60 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
15e70 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
15e80 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
15e90 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20   rc = fcntl(fd, 
15ea0 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
15eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
15ec0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
15ed0 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
15ee0 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
15ef0 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
15f00 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
15f10 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
15f20 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
15f30 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
15f40 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
15f50 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
15f60 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
15f70 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
15f80 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
15f90 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
15fa0 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
15fb0 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
15fc0 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
15fd0 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
15fe0 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
15ff0 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
16000 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
16010 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
16020 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
16030 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
16040 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
16050 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
16060 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
16070 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
16080 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
16090 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
160a0 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28  );..#else .  if(
160b0 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20   dataOnly ){.   
160c0 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
160d0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 4f 53 5f  fd);.    if( OS_
160e0 56 58 57 4f 52 4b 53 20 26 26 20 72 63 3d 3d 2d  VXWORKS && rc==-
160f0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
16100 53 55 50 20 29 7b 0a 20 20 20 20 20 20 72 63 20  SUP ){.      rc 
16110 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  = fsync(fd);.   
16120 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
16130 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
16140 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
16150 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16160 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
16170 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
16180 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
16190 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
161a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
161b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
161c0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
161d0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
161e0 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
161f0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
16200 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
16210 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
16220 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
16230 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
16240 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
16250 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
16260 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
16270 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
16280 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
16290 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
162a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
162b0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
162c0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
162d0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
162e0 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
162f0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
16300 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
16310 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
16320 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
16330 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
16340 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
16350 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
16360 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
16370 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
16380 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
16390 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
163a0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
163b0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
163c0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
163d0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
163e0 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
163f0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
16400 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
16410 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
16420 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
16430 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
16440 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
16450 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
16460 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
16470 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
16480 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
16490 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
164a0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
164b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
164c0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
164d0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
164e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
164f0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
16500 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
16510 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
16520 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
16530 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
16540 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
16550 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
16560 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
16570 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
16580 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
16590 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
165a0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
165b0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
165c0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
165d0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
165e0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
165f0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
16600 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
16610 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
16620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
16630 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
16640 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
16650 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
16660 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
16670 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
16680 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
16690 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
166a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
166b0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
166c0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
166d0 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20 25  RACE2("SYNC    %
166e0 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
166f0 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
16700 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
16710 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
16720 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
16730 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
16740 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
16750 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16760 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
16770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16780 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
16790 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
167a0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  fd>=0 ){.    int
167b0 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41 43   err;.    OSTRAC
167c0 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E4("DIRSYNC %-3d
167d0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
167e0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
167f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
16800 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  d,.            H
16810 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
16820 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e  sFullsync);.#ifn
16830 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
16840 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f  LE_DIRSYNC.    /
16850 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
16860 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74  sync is only att
16870 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66  empted if full_f
16880 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74  sync is.    ** t
16890 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61  urned off or una
168a0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20  vailable.  If a 
168b0 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72  full_fsync occur
168c0 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a  red above,.    *
168d0 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63  * then the direc
168e0 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70  tory sync is sup
168f0 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f  erfluous..    */
16900 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f  .    if( (!HAVE_
16910 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73  FULLFSYNC || !is
16920 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c  Fullsync) && ful
16930 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64  l_fsync(pFile->d
16940 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  irfd,0,0) ){.   
16950 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a      /*.       **
16960 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65   We have receive
16970 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72  d multiple repor
16980 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65  ts of fsync() re
16990 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a  turning.       *
169a0 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70  * errors when ap
169b0 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f  plied to directo
169c0 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20  ries on certain 
169d0 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20  file systems..  
169e0 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64       ** A failed
169f0 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
16a00 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61  is not a big dea
16a10 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a  l.  So it seems.
16a20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72         ** better
16a30 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65   to ignore the e
16a40 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31  rror.  Ticket #1
16a50 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  657.       */.  
16a60 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c       /* pFile->l
16a70 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
16a80 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72  ; */.       /* r
16a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16aa0 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  RR; */.    }.#en
16ab0 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20 63 6c  dif.    err = cl
16ac0 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
16ad0 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20  ); /* Only need 
16ae0 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f  to sync once, so
16af0 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20 20   close the */.  
16b00 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 20    if( err==0 ){ 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77  directory when w
16b30 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20  e are done */.  
16b40 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64      pFile->dirfd
16b50 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
16b60 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
16b70 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
16b80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
16b90 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
16ba0 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OSE;.    }.  }. 
16bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16bc0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
16bd0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
16be0 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
16bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
16c00 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
16c10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
16c20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  nByte){.  int rc
16c30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
16c40 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
16c50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
16c60 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
16c70 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72 75  E );.  rc = ftru
16c80 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c 65  ncate(((unixFile
16c90 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74  *)id)->h, (off_t
16ca0 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72  )nByte);.  if( r
16cb0 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  c ){.    ((unixF
16cc0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
16cd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
16ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16cf0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
16d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
16d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
16d30 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
16d40 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
16d50 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
16d60 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
16d70 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
16d80 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
16d90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
16da0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
16db0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
16dc0 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
16dd0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
16de0 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
16df0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
16e00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
16e10 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
16e20 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
16e30 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
16e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16e50 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
16e60 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
16e70 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
16e80 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
16e90 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
16ea0 65 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  e findLockInfo()
16eb0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
16ec0 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20  writes a single 
16ed0 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66  byte into that f
16ee0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
16ef0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75  work around a bu
16f00 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53  g.  ** in the OS
16f10 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  -X msdos filesys
16f20 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  tem.  In order t
16f30 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
16f40 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a   with upper.  **
16f50 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64   layers, we need
16f60 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20   to report this 
16f70 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72  file size as zer
16f80 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  o even though it
16f90 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20   is.  ** really 
16fa0 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36  1.   Ticket #326
16fb0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70  0..  */.  if( *p
16fc0 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65  Size==1 ) *pSize
16fd0 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e   = 0;...  return
16fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
16ff0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
17000 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
17010 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  & defined(__DARW
17020 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  IN__)./*.** Hand
17030 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
17040 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
17050 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
17060 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
17070 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
17080 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
17090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
170a0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
170b0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
170c0 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a  oid*);.#endif...
170d0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
170e0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
170f0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
17100 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
17110 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
17120 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
17130 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
17140 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
17150 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
17160 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
17170 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
17180 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
17190 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
171a0 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  )->locktype;.   
171b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
171c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
171d0 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
171e0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
171f0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
17200 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
17210 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
17220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17230 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
17240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
17250 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
17260 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20  d(__DARWIN__).  
17270 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
17280 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
17290 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
172a0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
172b0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
172c0 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
172d0 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
172e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
172f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17300 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
17310 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
17320 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
17330 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
17340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17350 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
17360 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
17370 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
17380 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
17390 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
173a0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
173b0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
173c0 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
173d0 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
173e0 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
173f0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
17400 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
17410 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
17420 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
17430 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
17440 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
17450 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
17460 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
17470 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
17480 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
17490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
174a0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
174b0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
174c0 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
174d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
174e0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
174f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
17500 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
17510 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
17520 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
17530 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
17540 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
17550 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
17560 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
17570 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
17580 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
17590 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a   0 for unix..*/.
175a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
175b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
175c0 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
175d0 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
175e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
175f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
17600 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  rn 0;.}../*.** H
17610 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
17620 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
17630 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
17640 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
17650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17660 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
17670 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
17680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
176a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
176f0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
17700 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
17710 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
17720 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
17730 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
17740 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
17750 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
17760 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
17770 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
17780 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
17790 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
177a0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
177b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
177c0 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
177d0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
177e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
177f0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
17800 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
17810 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
17820 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
17830 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
17840 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
17850 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
17860 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
17870 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
17880 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
17890 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
178a0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
178b0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
178c0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
178d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
178e0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
178f0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
17900 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
17910 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
17920 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
17930 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
17940 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
17950 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
17960 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
17970 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
17980 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
17990 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
179a0 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
179b0 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
179c0 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
179d0 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
179e0 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
179f0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
17a00 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
17a10 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
17a20 74 69 6f 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  tio named just "
17a30 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
17a40 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
17a50 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
17a60 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
17a70 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
17a80 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
17a90 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
17aa0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
17ab0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
17ac0 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
17ad0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
17ae0 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
17af0 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
17b00 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
17b10 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
17b20 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
17b30 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
17b40 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
17b50 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
17b60 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
17b70 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
17b80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
17b90 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
17ba0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
17bb0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
17bc0 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
17bd0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
17be0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
17bf0 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
17c00 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
17c10 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
17c20 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
17c30 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
17c40 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
17c50 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
17c60 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
17c70 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
17c80 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 43 4c 4f  DER, METHOD, CLO
17c90 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
17ca0 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 20  , CKLOCK)       
17cb0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
17cc0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
17cd0 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
17ce0 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 20 20 20 5c 0a 20 20 20 31 2c 20 20         \.   1,  
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
17d30 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
17d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17d70 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
17d80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
17db0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
17dc0 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
17dd0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
17e00 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17e10 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
17e20 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
17e50 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
17e60 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
17e70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
17ef0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
17f00 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
17f10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17f80 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
17fd0 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ff0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
18000 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18020 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
18030 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
18040 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18070 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18090 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
180c0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
180d0 74 65 72 69 73 74 69 63 73 20 20 20 2f 2a 20 78  teristics   /* x
180e0 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
180f0 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
18100 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
18160 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
18170 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
18180 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
18190 68 61 72 20 2a 7a 2c 20 69 6e 74 20 68 29 7b 20  har *z, int h){ 
181a0 20 20 20 20 20 20 20 20 5c 0a 20 20 55 4e 55 53          \.  UNUS
181b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
181c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
181d0 52 28 68 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(h);           
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
18200 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
182a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
182b0 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
182c0 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
182d0 61 72 2a 2c 69 6e 74 29 20 20 20 20 20 20 20 20  ar*,int)        
182e0 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
182f0 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
18300 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
18310 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
18320 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
18330 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
18340 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
18350 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
18360 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
18370 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
18380 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
18390 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
183a0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
183b0 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
183c0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
183d0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
183e0 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
183f0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
18400 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
18410 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
18420 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18440 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
18450 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18470 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
18480 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184a0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
184b0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
184c0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
184d0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
184e0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
184f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
18500 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
18510 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
18520 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
18530 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
18540 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
18550 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
18560 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
18570 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
18580 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18590 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
185a0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
185b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
185c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
185d0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
185e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
185f0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
18600 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
18610 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
18620 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
18630 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
18640 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
18650 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
18660 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
18670 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
18680 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
18690 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
186a0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
186b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
186c0 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  e */.  dotlockCl
186d0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
186e0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
186f0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
18700 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
18710 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
18720 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
18730 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
18740 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
18750 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
18760 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
18770 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
18780 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
18790 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
187a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
187b0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
187c0 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
187d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
187e0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
187f0 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
18800 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
18810 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
18820 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
18830 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c  ame */.  flockCl
18840 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
18850 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
18860 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f  hod */.  flockLo
18870 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
18880 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
18890 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c  od */.  flockUnl
188a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
188b0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
188c0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68  hod */.  flockCh
188d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
188e0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
188f0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
18900 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
18910 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
18920 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
18930 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
18940 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
18950 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
18960 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
18970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
18980 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
18990 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
189a0 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
189b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
189c0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
189d0 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
189e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
189f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
18a00 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
18a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
18a20 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
18a30 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
18a40 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
18a50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
18a60 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
18a70 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
18a80 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20  (__DARWIN__) && 
18a90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18aa0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
18ab0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
18ac0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
18ad0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
18ae0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
18af0 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
18b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
18b10 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
18b20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
18b30 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
18b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
18b50 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
18b60 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
18b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
18b80 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
18b90 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
18ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
18bb0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
18bc0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
18bd0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
18be0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
18bf0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
18c00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
18c10 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
18c20 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
18c30 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
18c40 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
18c50 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
18c60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18c70 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
18c80 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
18c90 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
18ca0 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
18cb0 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
18cc0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
18cd0 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
18ce0 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
18cf0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
18d00 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
18d10 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
18d20 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
18d30 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
18d40 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
18d50 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
18d60 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
18d70 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
18d80 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
18d90 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
18da0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
18db0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
18dc0 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
18dd0 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
18de0 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
18df0 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  f defined(__DARW
18e00 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  IN__) && SQLITE_
18e10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
18e20 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
18e30 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
18e40 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
18e50 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
18e60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
18e70 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
18e80 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
18e90 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
18ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
18eb0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
18ec0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
18ed0 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
18ee0 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
18ef0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
18f00 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
18f10 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
18f20 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
18f30 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
18f40 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
18f50 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ect name */.  pr
18f60 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
18f70 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
18f80 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
18f90 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
18fa0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
18fb0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
18fc0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
18fd0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
18fe0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
18ff0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
19000 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
19010 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
19020 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
19030 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ...#if defined(_
19040 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20 53 51  _DARWIN__) && SQ
19050 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19060 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
19070 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
19080 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
19090 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
190a0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
190b0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
190c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
190d0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
190e0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
190f0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
19100 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
19110 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
19120 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
19130 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
19140 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
19150 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
19160 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
19170 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
19180 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
19190 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
191a0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
191b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
191c0 2a 2f 0a 20 20 69 6e 74 20 66 64 20 20 20 20 20  */.  int fd     
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
191f0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
19200 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
19210 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19220 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
19230 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19240 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
19250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19260 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
19270 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
19280 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19290 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
192a0 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
192b0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
192c0 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
192d0 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
192e0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
192f0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
19300 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
19310 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
19320 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
19330 6f 64 73 20 7d 2c 0a 23 69 66 64 65 66 20 53 51  ods },.#ifdef SQ
19340 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50 5f  LITE_ENABLE_AFP_
19350 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20 20  LOCKING_SMB.    
19360 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
19370 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6c  IoMethods },.#el
19380 73 65 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  se.    { "smbfs"
19390 2c 20 20 26 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  ,  &flockIoMetho
193a0 64 73 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  ds },.#endif.   
193b0 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
193c0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
193d0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
193e0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
193f0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
19400 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
19410 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
19420 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
19430 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
19440 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
19450 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
19460 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
19470 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
19480 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
19490 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
194a0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
194b0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
194c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
194d0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
194e0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
194f0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
19500 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
19510 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
19520 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
19530 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
19540 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
19550 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
19560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
19570 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
19580 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
19590 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
195a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
195b0 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
195c0 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
195d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
195e0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
195f0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
19600 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
19610 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
19620 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
19630 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
19640 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
19650 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
19660 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
19670 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
19680 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
19690 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
196a0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
196b0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
196c0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
196d0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
196e0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
196f0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
19700 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
19710 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
19720 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
19730 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
19740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19750 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
19760 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
19770 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
19780 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
19790 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
197a0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
197b0 68 61 72 2a 2c 69 6e 74 29 0a 20 20 20 20 20 20  har*,int).      
197c0 20 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69    = autolockIoFi
197d0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
197e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 44  f /* defined(__D
197f0 41 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49  ARWIN__) && SQLI
19800 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19810 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
19820 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
19830 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
19840 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
19850 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
19860 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
19870 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
19880 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
19890 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
198a0 2c 69 6e 74 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ,int);.../******
198b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19910 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
19920 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19940 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
19950 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
19960 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
19970 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
19980 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
19990 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
199a0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
199b0 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
199c0 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
199d0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
199e0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
199f0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
19a00 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
19a10 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
19a20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19a30 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
19a40 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
19a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
19a60 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
19a70 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
19a80 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
19a90 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
19aa0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
19ab0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
19ac0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
19ad0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
19ae0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
19af0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
19b00 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
19b10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
19b20 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
19b30 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
19b40 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
19b50 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
19b60 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
19b70 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
19b80 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
19b90 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
19ba0 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
19bb0 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
19bc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19bd0 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
19be0 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
19bf0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
19c00 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
19c10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19c20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
19c30 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61  ock==NULL );.  a
19c40 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70  ssert( pNew->pOp
19c50 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f  en==NULL );..  /
19c60 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65  * Parameter isDe
19c70 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  lete is only use
19c80 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 0a 20 20  d on vxworks..  
19c90 2a 2a 20 45 78 70 72 65 73 73 20 74 68 69 73 20  ** Express this 
19ca0 65 78 70 6c 69 63 69 74 6c 79 20 68 65 72 65 20  explicitly here 
19cb0 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
19cc0 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 20 20 2a  ler warnings.  *
19cd0 2a 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  * about unused p
19ce0 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
19cf0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
19d00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19d10 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 23 65  ER(isDelete);.#e
19d20 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 33  ndif..  OSTRACE3
19d30 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
19d40 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
19d50 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d  me);    .  pNew-
19d60 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
19d70 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20  dirfd = dirfd;. 
19d80 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e   SET_THREADID(pN
19d90 65 77 29 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ew);..#if OS_VXW
19da0 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
19db0 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
19dc0 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
19dd0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
19de0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63  ==0 ){.    noLoc
19df0 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
19e00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19e10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
19e20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  noLock ){.    pL
19e30 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
19e40 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
19e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
19e60 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
19e70 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
19e80 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
19e90 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 23 69 66  ilename, h);.#if
19ea0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19eb0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
19ec0 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
19ed0 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
19ee0 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
19ef0 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
19f00 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
19f10 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
19f20 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
19f30 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
19f40 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
19f50 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
19f60 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
19f70 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
19f80 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
19f90 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
19fa0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
19fb0 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
19fc0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
19fd0 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
19fe0 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
19ff0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 75  Methods ){.    u
1a000 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1a010 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
1a020 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  ckInfo(pNew, &pN
1a030 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77  ew->pLock, &pNew
1a040 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e  ->pOpen);.    un
1a050 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a060 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1a070 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1a080 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1a090 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20 65 6c  __DARWIN__).  el
1a0a0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
1a0b0 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
1a0c0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
1a0d0 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
1a0e0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
1a0f0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
1a100 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
1a110 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
1a120 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
1a130 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
1a140 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
1a150 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
1a160 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
1a170 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1a180 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
1a190 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
1a1a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a1b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a1c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1a1d0 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
1a1e0 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
1a1f0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
1a200 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
1a210 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
1a220 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
1a230 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
1a240 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
1a250 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
1a260 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
1a270 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
1a280 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
1a290 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
1a2a0 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
1a2b0 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
1a2c0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
1a2d0 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
1a2e0 4e 65 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e 65 77  New, NULL, &pNew
1a2f0 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  ->pOpen);.      
1a300 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1a310 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
1a320 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
1a330 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
1a340 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
1a350 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
1a360 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
1a370 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1a380 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1a390 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1a3a0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1a3b0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
1a3c0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
1a3d0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
1a3e0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
1a3f0 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
1a400 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
1a410 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
1a420 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
1a430 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1a440 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
1a450 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
1a460 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
1a470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a480 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1a490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1a4a0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
1a4b0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
1a4c0 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
1a4d0 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
1a4e0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
1a4f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
1a500 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
1a510 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1a520 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
1a530 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
1a540 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
1a550 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
1a560 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
1a570 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
1a580 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
1a590 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
1a5a0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
1a5b0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
1a5c0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1a5d0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
1a5e0 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  indLockInfo(pNew
1a5f0 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
1a600 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
1a610 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1a620 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
1a630 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55  >pOpen->pSem==NU
1a640 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
1a650 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
1a660 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
1a670 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
1a680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1a690 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1a6a0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
1a6b0 20 22 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20   "%s.sem",.     
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
1a6e0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
1a6f0 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b 20 7a 53      for( n=0; zS
1a700 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
1a710 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
1a720 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
1a730 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
1a740 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
1a750 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  Open->pSem = sem
1a760 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
1a770 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
1a780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
1a790 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d  w->pOpen->pSem =
1a7a0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
1a7b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1a7c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1a7d0 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e     pNew->pOpen->
1a7e0 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
1a7f0 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
1a800 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
1a810 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
1a820 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
1a830 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
1a840 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1a850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a860 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
1a870 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
1a880 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
1a890 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
1a8a0 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
1a8b0 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
1a8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1a8d0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
1a8e0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
1a8f0 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61  ilent leak if fa
1a900 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
1a910 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  rror */.    clos
1a920 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(h);.  }else{. 
1a930 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
1a940 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
1a950 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
1a960 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
1a970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a980 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1a990 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1a9a0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1a9b0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1a9c0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1a9d0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1a9e0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1a9f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1aa00 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1aa10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1aa20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1aa30 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1aa40 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1aa50 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1aa60 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1aa70 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1aa80 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1aa90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1aaa0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1aab0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1aac0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1aad0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1aae0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1aaf0 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1ab00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1ab10 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1ab20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1ab30 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1ab40 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1ab50 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1ab60 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1ab70 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1ab80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1ab90 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1aba0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1abb0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1abc0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1abd0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1abe0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1abf0 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1ac00 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1ac10 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1ac20 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
1ac30 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1ac40 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1ac50 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
1ac60 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  {.#ifdef FD_CLOE
1ac70 58 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28  XEC.      fcntl(
1ac80 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e  fd, F_SETFD, fcn
1ac90 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
1aca0 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
1acb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1acc0 53 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52  STRACE3("OPENDIR
1acd0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1ace0 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20   zDirname);.    
1acf0 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  }.  }.  *pFd = f
1ad00 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e  d;.  return (fd>
1ad10 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c  =0?SQLITE_OK:SQL
1ad20 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d  ITE_CANTOPEN);.}
1ad30 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1ad40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1ad50 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
1ad60 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
1ad70 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
1ad80 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
1ad90 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
1ada0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
1adb0 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
1adc0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
1add0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1ade0 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
1adf0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1ae00 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
1ae10 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
1ae20 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
1ae30 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
1ae40 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
1ae50 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
1ae60 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
1ae70 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
1ae80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ae90 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
1aea0 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
1aeb0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
1aec0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
1aed0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
1aee0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
1aef0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
1af00 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , j;.  struct st
1af10 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
1af20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22  char *zDir = "."
1af30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
1af40 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
1af50 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
1af60 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
1af70 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
1af80 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
1af90 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
1afa0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
1afb0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
1afc0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
1afd0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
1afe0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1aff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b000 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b  RR );..  azDirs[
1b010 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
1b020 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
1b030 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72  f (NULL == azDir
1b040 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69  s[1]) {.    azDi
1b050 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
1b060 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20  TMPDIR");.  }.  
1b070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1b080 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
1b090 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
1b0a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
1b0b0 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
1b0c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
1b0d0 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
1b0e0 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
1b0f0 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
1b100 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
1b110 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1b120 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
1b130 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
1b140 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
1b150 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
1b160 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
1b170 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
1b180 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
1b190 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
1b1a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1b1b0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
1b1c0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
1b1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b1e0 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
1b1f0 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
1b200 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
1b210 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
1b220 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e  17) >= (size_t)n
1b230 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
1b240 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1b250 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73    }..  do{.    s
1b260 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b270 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
1b280 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
1b290 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
1b2a0 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74  r);.    j = (int
1b2b0 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
1b2c0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1b2d0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
1b2e0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
1b2f0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
1b300 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
1b310 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
1b320 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
1b330 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
1b340 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
1b350 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
1b360 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
1b370 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
1b380 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
1b390 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1b3a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1b3b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1b3c0 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
1b3d0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
1b3e0 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
1b3f0 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
1b400 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
1b410 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
1b420 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
1b430 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
1b440 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
1b450 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
1b460 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
1b470 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
1b480 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
1b490 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
1b4a0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
1b4b0 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
1b4c0 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
1b4d0 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
1b4e0 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
1b4f0 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
1b500 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
1b510 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
1b520 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
1b530 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
1b540 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
1b550 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
1b560 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
1b570 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
1b580 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
1b590 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
1b5a0 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
1b5b0 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
1b5c0 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
1b5d0 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
1b5e0 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
1b5f0 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
1b600 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
1b610 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
1b620 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
1b630 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
1b640 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
1b650 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
1b660 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
1b670 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
1b680 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
1b690 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
1b6a0 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
1b6b0 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
1b6c0 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
1b6d0 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
1b6e0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
1b6f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
1b700 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
1b710 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
1b720 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
1b730 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
1b740 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
1b750 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
1b760 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
1b770 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
1b780 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
1b790 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
1b7a0 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
1b7b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
1b7c0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
1b7d0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
1b7e0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
1b7f0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
1b800 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
1b810 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1b820 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
1b830 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
1b840 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
1b850 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
1b860 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
1b870 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
1b880 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1b890 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
1b8a0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
1b8d0 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
1b8e0 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
1b8f0 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
1b900 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
1b910 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
1b920 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
1b930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d  */.){.  int fd =
1b940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b950 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1b960 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
1b970 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
1b980 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
1b990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b9a0 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69   /* Directory fi
1b9b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1b9c0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1b9d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b9e0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
1b9f0 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
1ba00 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
1ba10 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
1ba20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
1ba30 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1ba40 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba60 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
1ba70 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
1ba80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1ba90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20  LITE_OK;..  int 
1baa0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
1bab0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1bac0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
1bad0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1bae0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1baf0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1bb00 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
1bb10 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
1bb20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1bb30 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
1bb40 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
1bb50 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1bb60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1bb70 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
1bb80 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
1bb90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1bba0 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66  WRITE);..  /* If
1bbb0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
1bbc0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
1bbd0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
1bbe0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
1bbf0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
1bc00 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
1bc10 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
1bc20 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
1bc30 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
1bc40 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
1bc50 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1bc60 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
1bc70 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
1bc80 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
1bc90 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
1bca0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 0a  = (isCreate && .
1bcb0 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51        (eType==SQ
1bcc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1bcd0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
1bce0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1bcf0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29  AIN_JOURNAL).  )
1bd00 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
1bd10 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
1bd20 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
1bd30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
1bd40 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
1bd50 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
1bd60 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
1bd70 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
1bd80 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
1bd90 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
1bda0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
1bdb0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
1bdc0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
1bdd0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
1bde0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1bdf0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
1be00 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
1be10 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
1be20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
1be30 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
1be40 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
1be50 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
1be60 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
1be70 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
1be80 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
1be90 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
1bea0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
1beb0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
1bec0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
1bed0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
1bee0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
1bef0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
1bf00 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
1bf10 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
1bf20 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
1bf30 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
1bf40 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
1bf50 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
1bf60 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
1bf70 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
1bf80 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
1bf90 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
1bfa0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
1bfb0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
1bfc0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
1bfd0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
1bfe0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
1bff0 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73  journal, and mas
1c000 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
1c010 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63 61  never automatica
1c020 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64  lly.  ** deleted
1c030 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c040 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1c050 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c 20 21 69  EN_MAIN_DB || !i
1c060 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73  sDelete );.  ass
1c070 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
1c080 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1c090 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74  RNAL || !isDelet
1c0a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
1c0b0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1c0c0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1c0d0 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b   || !isDelete );
1c0e0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1c0f0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
1c100 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
1c110 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
1c120 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
1c130 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
1c140 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1c150 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1c160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c170 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
1c180 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1c190 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
1c1a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1c1b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1c1c0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1c1d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1c1e0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
1c1f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1c200 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1c210 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1c220 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1c230 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20 29  TRANSIENT_DB.  )
1c240 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  ;..  memset(pFil
1c250 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
1c260 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
1c270 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  !zName ){.    as
1c280 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
1c290 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72   !isOpenDirector
1c2a0 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  y);.    rc = get
1c2b0 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
1c2c0 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
1c2d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c2f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c300 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
1c310 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
1c320 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
1c330 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  )  openFlags |= 
1c340 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
1c350 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70  isReadWrite ) op
1c360 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57  enFlags |= O_RDW
1c370 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  R;.  if( isCreat
1c380 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  e )    openFlags
1c390 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
1c3a0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
1c3b0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
1c3c0 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
1c3d0 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  );.  openFlags |
1c3e0 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
1c3f0 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66 64 20  _BINARY);..  fd 
1c400 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  = open(zName, op
1c410 65 6e 46 6c 61 67 73 2c 20 69 73 44 65 6c 65 74  enFlags, isDelet
1c420 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
1c430 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1c440 53 53 49 4f 4e 53 29 3b 0a 20 20 4f 53 54 52 41  SSIONS);.  OSTRA
1c450 43 45 34 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE4("OPENX   %-3
1c460 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
1c470 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
1c480 73 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 26  s);.  if( fd<0 &
1c490 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
1c4a0 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
1c4b0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
1c4c0 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20  {.    /* Failed 
1c4d0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
1c4e0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1c4f0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
1c500 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6c  -only. */.    fl
1c510 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
1c520 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1c530 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1c540 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  E);.    flags |=
1c550 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1c560 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74 75 72  DONLY;.    retur
1c570 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66 73 2c  n unixOpen(pVfs,
1c580 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 66   zPath, pFile, f
1c590 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
1c5a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
1c5b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c5c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
1c5d0 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65    }.  if( isDele
1c5e0 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
1c5f0 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
1c600 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
1c610 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b    unlink(zName);
1c620 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
1c630 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c640 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
1c650 73 65 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  se{.    ((unixFi
1c660 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6f 70 65 6e  le*)pFile)->open
1c670 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
1c680 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  s;.  }.#endif.  
1c690 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
1c6a0 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
1c6b0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
1c6c0 61 73 73 65 72 74 28 66 64 21 3d 30 29 3b 0a 20  assert(fd!=0);. 
1c6d0 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63   if( isOpenDirec
1c6e0 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  tory ){.    rc =
1c6f0 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
1c700 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1c710 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c  E_OK ){.      cl
1c730 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
1c740 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
1c750 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72  l, already in er
1c760 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
1c770 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c780 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  }..#ifdef FD_CLO
1c790 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c  EXEC.  fcntl(fd,
1c7a0 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
1c7b0 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
1c7c0 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
1c7d0 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
1c7e0 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
1c7f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 23  OPEN_MAIN_DB;..#
1c800 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
1c810 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
1c820 20 69 66 28 20 7a 50 61 74 68 21 3d 4e 55 4c 4c   if( zPath!=NULL
1c830 20 26 26 20 21 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   && !noLock ){. 
1c840 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
1c850 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
1c860 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
1c870 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
1c880 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
1c890 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
1c8a0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
1c8b0 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
1c8c0 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
1c8d0 78 79 2c 20 0a 20 20 20 20 2a 2a 20 30 20 6d 65  xy, .    ** 0 me
1c8e0 61 6e 73 20 6e 65 76 65 72 20 75 73 65 20 70 72  ans never use pr
1c8f0 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
1c900 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
1c910 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
1c920 6c 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ly.    */.    if
1c930 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
1c940 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
1c950 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
1c960 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
1c970 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1c980 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20  tatfs fsInfo;.. 
1c990 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28       if( statfs(
1c9a0 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  zPath, &fsInfo) 
1c9b0 3d 3d 20 2d 31 20 29 7b 0a 09 09 09 09 28 28 75  == -1 ){.....((u
1c9c0 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
1c9d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1c9e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
1c9f0 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
1ca00 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
1ca10 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
1ca20 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
1ca30 20 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29         close(fd)
1ca40 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
1ca50 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
1ca60 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
1ca70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ca80 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
1ca90 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f    }.      usePro
1caa0 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
1cab0 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
1cac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cad0 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
1cae0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
1caf0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
1cb00 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  dirfd, pFile, zP
1cb10 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44  ath, noLock, isD
1cb20 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66  elete);.      if
1cb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cb40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cb50 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
1cb60 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
1cb70 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
1cb80 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
1cb90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cba0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1cbb0 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e  .  return fillIn
1cbc0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
1cbd0 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
1cbe0 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20   zPath, noLock, 
1cbf0 69 73 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a 2f 2a  isDelete);.}../*
1cc00 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
1cc10 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
1cc20 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
1cc30 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
1cc40 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
1cc50 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
1cc60 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
1cc70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cc80 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
1cc90 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
1cca0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
1ccb0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
1ccc0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
1ccd0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
1cce0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
1ccf0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
1cd00 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
1cd10 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
1cd20 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
1cd30 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
1cd40 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
1cd50 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
1cd60 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1cd70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cd80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1cd90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
1cda0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
1cdb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1cdc0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69  _DELETE);.  unli
1cdd0 6e 6b 28 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64  nk(zPath);.#ifnd
1cde0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1cdf0 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
1ce00 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
1ce10 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
1ce20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
1ce30 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
1ce40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ce50 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
1ce60 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
1ce70 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
1ce80 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
1ce90 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
1cea0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1ceb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1cec0 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20  R_DIR_FSYNC;.   
1ced0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1cee0 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20 29 7b  lose(fd)&&!rc ){
1cef0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cf00 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
1cf10 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOSE;.      }.  
1cf20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
1cf30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cf40 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
1cf50 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63  istance of or ac
1cf60 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
1cf70 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
1cf80 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
1cf90 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
1cfa0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
1cfb0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
1cfc0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1cfd0 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
1cfe0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
1cff0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
1d000 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
1d010 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1d020 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
1d030 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
1d040 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
1d050 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
1d060 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
1d070 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
1d080 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
1d090 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
1d0a0 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
1d0b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1d0c0 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
1d0d0 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
1d0e0 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
1d0f0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
1d100 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
1d110 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
1d120 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
1d130 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d150 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
1d160 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
1d170 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
1d180 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
1d190 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
1d1a0 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
1d1b0 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
1d1c0 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
1d1d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d1e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1d1f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1d200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d210 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
1d220 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
1d230 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1d240 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1d250 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
1d260 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
1d270 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1d280 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
1d290 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
1d2a0 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
1d2b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1d2c0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1d2d0 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
1d2e0 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
1d2f0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
1d300 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
1d310 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
1d320 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
1d330 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
1d340 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
1d350 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65  amode)==0);.  re
1d360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d370 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
1d380 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
1d390 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
1d3a0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
1d3b0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
1d3c0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
1d3d0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1d3e0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
1d3f0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
1d400 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
1d410 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
1d420 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
1d430 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
1d440 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
1d450 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
1d460 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
1d470 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
1d480 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
1d490 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
1d4a0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
1d4b0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1d4c0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
1d4d0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
1d4e0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1d4f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d500 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
1d510 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d520 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
1d530 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
1d540 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
1d550 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d580 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
1d590 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
1d5a0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
1d5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1d5c0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
1d5d0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
1d5e0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
1d5f0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
1d600 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
1d610 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
1d620 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
1d630 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
1d640 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
1d650 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
1d660 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
1d670 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
1d680 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
1d690 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
1d6a0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
1d6b0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
1d6c0 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
1d6d0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
1d6e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1d6f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1d700 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
1d710 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
1d720 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
1d730 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d740 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f  TER(pVfs);..  zO
1d750 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
1d760 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
1d770 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
1d780 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1d790 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
1d7a0 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
1d7b0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
1d7c0 20 20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a      if( getcwd(z
1d7d0 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
1d7e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d7f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1d800 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
1d810 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
1d820 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1d830 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e  _snprintf(nOut-n
1d840 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d  Cwd, &zOut[nCwd]
1d850 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b  , "/%s", zPath);
1d860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d870 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
1d880 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d890 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
1d8a0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
1d8b0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
1d8c0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
1d8d0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
1d8e0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
1d8f0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1d900 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
1d910 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1d920 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
1d930 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
1d940 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
1d950 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
1d960 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
1d970 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1d980 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d990 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1d9a0 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
1d9b0 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
1d9c0 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
1d9d0 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
1d9e0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1d9f0 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
1da00 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
1da10 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
1da20 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
1da30 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
1da40 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
1da50 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
1da60 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
1da70 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
1da80 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
1da90 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
1daa0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
1dab0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
1dac0 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
1dad0 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
1dae0 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
1daf0 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
1db00 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
1db10 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
1db20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1db30 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
1db40 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
1db50 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
1db60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1db70 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
1db80 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1db90 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
1dba0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
1dbb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1dbc0 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
1dbd0 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
1dbe0 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
1dbf0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
1dc00 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
1dc10 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
1dc20 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
1dc30 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
1dc40 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
1dc50 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
1dc60 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
1dc70 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
1dc80 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
1dc90 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
1dca0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
1dcb0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
1dcc0 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
1dcd0 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
1dce0 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
1dcf0 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
1dd00 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
1dd10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
1dd20 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
1dd30 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
1dd40 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
1dd50 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
1dd60 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
1dd70 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
1dd80 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
1dd90 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
1dda0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
1ddb0 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
1ddc0 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
1ddd0 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
1dde0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
1ddf0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
1de00 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
1de10 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
1de20 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
1de30 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
1de40 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
1de50 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
1de60 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
1de70 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
1de80 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
1de90 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
1dea0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
1deb0 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
1dec0 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
1ded0 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
1dee0 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
1def0 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
1df00 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
1df10 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
1df20 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
1df30 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
1df40 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
1df50 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
1df60 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
1df70 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
1df80 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
1df90 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
1dfa0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
1dfb0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
1dfc0 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
1dfd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1dfe0 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
1dff0 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
1e000 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
1e010 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
1e020 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
1e030 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1e040 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
1e050 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
1e060 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
1e070 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1e080 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1e090 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
1e0a0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
1e0b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
1e0c0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
1e0d0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
1e0e0 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
1e0f0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
1e100 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
1e110 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
1e120 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
1e130 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
1e140 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
1e150 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
1e160 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
1e170 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
1e180 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
1e190 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
1e1a0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
1e1b0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
1e1c0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1e1d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e1e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1e1f0 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
1e200 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
1e210 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
1e220 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
1e230 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1e240 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
1e250 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
1e260 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
1e270 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
1e280 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
1e290 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
1e2a0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
1e2b0 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
1e2c0 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
1e2d0 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
1e2e0 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
1e2f0 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
1e300 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
1e310 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
1e320 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
1e330 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
1e340 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
1e350 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
1e360 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
1e370 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
1e380 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
1e390 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
1e3a0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
1e3b0 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
1e3c0 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
1e3d0 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
1e3e0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
1e3f0 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
1e400 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
1e410 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
1e420 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
1e430 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
1e440 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
1e450 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
1e460 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
1e470 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
1e480 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
1e490 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
1e4a0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
1e4b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e4c0 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
1e4d0 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
1e4e0 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64     fd = open("/d
1e4f0 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
1e500 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20  DONLY);.    if( 
1e510 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
1e520 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
1e530 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
1e540 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
1e550 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
1e560 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b   pid = getpid();
1e570 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
1e580 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  Buf[sizeof(t)], 
1e590 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
1e5a0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1e5b0 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65  ( sizeof(t)+size
1e5c0 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74  of(pid)<=(size_t
1e5d0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e  )nBuf );.      n
1e5e0 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20  Buf = sizeof(t) 
1e5f0 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  + sizeof(pid);. 
1e600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e610 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64 2c 20  nBuf = read(fd, 
1e620 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20  zBuf, nBuf);.   
1e630 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
1e640 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
1e650 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
1e660 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
1e670 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
1e680 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
1e690 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
1e6a0 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
1e6b0 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
1e6c0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
1e6d0 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
1e6e0 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
1e6f0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
1e700 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
1e710 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
1e720 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
1e730 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
1e740 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
1e750 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
1e760 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
1e770 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
1e780 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1e790 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
1e7a0 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
1e7b0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
1e7c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1e7d0 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
1e7e0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
1e7f0 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
1e800 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1e810 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
1e820 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
1e830 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
1e840 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
1e850 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
1e860 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
1e870 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
1e880 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
1e890 4c 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  LL);.  return mi
1e8a0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
1e8b0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
1e8c0 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
1e8d0 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
1e8e0 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
1e8f0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
1e900 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
1e910 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
1e920 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
1e930 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
1e940 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65  p(seconds);.  re
1e950 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
1e960 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 55  0000;.#endif.  U
1e970 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1e980 4e 6f 74 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 0a  NotUsed);.}../*.
1e990 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1e9a0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
1e9b0 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
1e9c0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
1e9d0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
1e9e0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
1e9f0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
1ea00 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
1ea10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
1ea20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
1ea30 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
1ea40 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
1ea50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
1ea60 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
1ea70 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
1ea80 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
1ea90 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
1eaa0 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
1eab0 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
1eac0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
1ead0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
1eae0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
1eaf0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
1eb00 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
1eb10 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
1eb20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
1eb30 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
1eb40 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
1eb50 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
1eb60 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
1eb70 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
1eb80 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
1eb90 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
1eba0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
1ebb0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20  le *prNow){.#if 
1ebc0 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
1ebd0 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
1ebe0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
1ebf0 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20  Now = t/86400.0 
1ec00 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c  + 2440587.5;.#el
1ec10 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1ec20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
1ec30 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
1ec40 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
1ec50 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
1ec60 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37  *prNow = 2440587
1ec70 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63  .5 + sNow.tv_sec
1ec80 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e  /86400.0 + sNow.
1ec90 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30 30 30  tv_nsec/86400000
1eca0 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73 65 0a  000000.0;.#else.
1ecb0 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
1ecc0 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65   sNow;.  gettime
1ecd0 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b  ofday(&sNow, 0);
1ece0 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30  .  *prNow = 2440
1ecf0 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f  587.5 + sNow.tv_
1ed00 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e  sec/86400.0 + sN
1ed10 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30  ow.tv_usec/86400
1ed20 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66  000000.0;.#endif
1ed30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ed40 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
1ed50 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1ed60 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
1ed70 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
1ed80 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32  time/86400.0 + 2
1ed90 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65  440587.5;.  }.#e
1eda0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
1edb0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1edc0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1edd0 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
1ede0 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
1edf0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
1ee00 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
1ee10 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
1ee20 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
1ee30 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
1ee40 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
1ee50 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
1ee60 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
1ee70 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
1ee80 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
1ee90 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
1eea0 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
1eeb0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
1eec0 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
1eed0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
1eee0 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
1eef0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
1ef00 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
1ef10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
1ef20 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
1ef30 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1ef40 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
1ef50 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
1ef60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ef70 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
1ef80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ef90 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
1efa0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1efb0 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
1efc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a  n 0;.}../*.*****
1efd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efe0 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
1eff0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
1f000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1f020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1f070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1f0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f0d0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
1f0e0 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
1f0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1f110 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
1f120 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
1f130 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
1f140 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
1f150 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
1f160 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
1f170 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
1f180 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
1f190 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
1f1a0 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
1f1b0 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
1f1c0 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
1f1d0 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
1f1e0 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
1f1f0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
1f200 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
1f210 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
1f220 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
1f230 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
1f240 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
1f250 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
1f260 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
1f270 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
1f280 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
1f290 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
1f2a0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
1f2b0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
1f2c0 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
1f2d0 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
1f2e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1f2f0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
1f300 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
1f310 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
1f320 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
1f330 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
1f340 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
1f350 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1f360 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
1f370 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
1f380 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
1f390 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
1f3a0 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
1f3b0 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
1f3c0 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
1f3d0 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
1f3e0 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
1f3f0 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
1f400 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
1f410 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
1f420 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
1f430 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
1f440 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
1f450 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
1f460 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
1f470 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
1f480 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
1f490 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
1f4a0 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
1f4b0 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
1f4c0 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
1f4d0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
1f4e0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
1f4f0 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
1f500 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
1f510 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
1f520 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
1f530 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
1f540 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
1f550 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
1f560 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
1f570 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
1f580 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
1f590 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
1f5a0 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
1f5b0 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
1f5c0 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
1f5d0 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
1f5e0 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
1f5f0 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20  000000..   ..** 
1f600 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
1f610 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
1f620 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
1f630 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
1f640 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
1f650 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
1f660 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
1f670 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
1f680 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
1f690 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
1f6a0 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
1f6b0 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
1f6c0 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
1f6d0 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
1f6e0 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
1f6f0 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
1f700 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
1f710 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
1f720 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
1f730 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
1f740 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
1f750 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
1f760 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
1f770 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
1f780 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
1f790 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
1f7a0 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
1f7b0 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
1f7c0 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
1f7d0 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
1f7e0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
1f7f0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
1f800 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
1f810 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
1f820 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
1f830 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
1f840 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
1f850 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
1f860 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
1f870 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
1f880 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
1f890 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
1f8a0 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
1f8b0 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
1f8c0 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
1f8d0 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
1f8e0 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
1f8f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
1f900 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
1f910 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
1f920 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
1f930 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
1f940 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
1f950 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
1f960 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
1f970 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
1f980 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
1f990 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
1f9a0 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
1f9b0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1f9c0 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
1f9d0 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
1f9e0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
1f9f0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
1fa00 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
1fa10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa20 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
1fa30 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
1fa40 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
1fa50 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45  bname, SQLITE_SE
1fa60 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
1fa70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fa80 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
1fa90 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
1faa0 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
1fab0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1fac0 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
1fad0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1fae0 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e  E, &<proxy_path>
1faf0 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20  );.**.**.** SQL 
1fb00 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50  pragmas.**.**  P
1fb10 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
1fb20 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
1fb30 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20  =<proxy_path> | 
1fb40 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d  :auto:.**  PRAGM
1fb50 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
1fb60 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a  k_proxy_file.**.
1fb70 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a  ** Specifying ":
1fb80 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61  auto:" means tha
1fb90 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  t if there is a 
1fba0 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20  conch file with 
1fbb0 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f  a matching.** ho
1fbc0 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65  st ID in it, the
1fbd0 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74   proxy path in t
1fbe0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
1fbf0 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65  ll be used, othe
1fc00 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79  rwise.** a proxy
1fc10 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74   path based on t
1fc20 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64  he user's temp d
1fc30 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73  ir.** (via confs
1fc40 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
1fc50 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29  ER_TEMP_DIR,...)
1fc60 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  ) will be used a
1fc70 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c  nd the.** actual
1fc80 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65   proxy file name
1fc90 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
1fca0 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20  om the name and 
1fcb0 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64  path of the.** d
1fcc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46  atabase file.  F
1fcd0 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1fce0 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61  *       For data
1fcf0 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72  base path "/User
1fd00 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a  s/me/foo.db" .**
1fd10 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20         The lock 
1fd20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74  path will be "<t
1fd30 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f  mpdir>/sqliteplo
1fd40 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f  cks/_Users_me_fo
1fd50 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a  o.db:auto:").**.
1fd60 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70  ** Once a lock p
1fd70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72  roxy is configur
1fd80 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ed for a databas
1fd90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74  e connection, it
1fda0 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72   can not.** be r
1fdb0 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20  emoved, however 
1fdc0 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68  it may be switch
1fdd0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1fde0 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61  t proxy path via
1fdf0 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50  .** the above AP
1fe00 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  Is (assuming the
1fe10 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e   conch file is n
1fe20 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ot being held by
1fe30 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e   another.** conn
1fe40 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73  ection or proces
1fe50 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f  s). .**.**.** Ho
1fe60 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  w proxy locking 
1fe70 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  works.** -------
1fe80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe90 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c  .**.** Proxy fil
1fea0 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73  e locking relies
1feb0 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77   primarily on tw
1fec0 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67  o new supporting
1fed0 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20   files: .**.**  
1fee0 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74   *  conch file t
1fef0 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74  o limit access t
1ff00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1ff10 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ile to a single 
1ff20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20  host.**      at 
1ff30 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a  a time.**.**   *
1ff40 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20    proxy file to 
1ff50 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66  act as a proxy f
1ff60 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20  or the advisory 
1ff70 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  locks normally.*
1ff80 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20  *      taken on 
1ff90 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  the database.**.
1ffa0 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  ** The conch fil
1ffb0 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f  e - to use a pro
1ffc0 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20  xy file, sqlite 
1ffd0 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64  must first "hold
1ffe0 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62   the conch".** b
1fff0 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69  y taking an sqli
20000 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20  te-style shared 
20010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
20020 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20  h file, reading 
20030 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
20040 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  and comparing th
20050 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20  e host's unique 
20060 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c  host ID (see bel
20070 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20  ow) and lock.** 
20080 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e  proxy path again
20090 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  st the values st
200a0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63  ored in the conc
200b0 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69  h.  The conch fi
200c0 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20  le is.** stored 
200d0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
200e0 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74  ctory as the dat
200f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
20100 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20  he file name.** 
20110 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74  is patterned aft
20120 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
20130 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c  file name as ".<
20140 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f  databasename>-co
20150 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20  nch"..** If the 
20160 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20  conch file does 
20170 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74  not exist, or it
20180 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  's contents do n
20190 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  ot match the.** 
201a0 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70  host ID and/or p
201b0 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20  roxy path, then 
201c0 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61  the lock is esca
201d0 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c  lated to an excl
201e0 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e  usive.** lock an
201f0 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  d the conch file
20200 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64   contents is upd
20210 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f  ated with the ho
20220 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a  st ID and proxy.
20230 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20  ** path and the 
20240 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64  lock is downgrad
20250 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ed to a shared l
20260 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74  ock again.  If t
20270 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68  he conch.** is h
20280 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70  eld by another p
20290 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73  rocess (with a s
202a0 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65  hared lock), the
202b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
202c0 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64  ** will fail and
202d0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
202e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
202f0 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d  The proxy file -
20300 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66   a single-byte f
20310 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ile used for all
20320 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c   advisory file l
20330 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79  ocks.** normally
20340 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
20350 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54  tabase file.   T
20360 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73  his allows for s
20370 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f  afe sharing.** o
20380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20390 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ile for multiple
203a0 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
203b0 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ters on the same
203c0 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f  .** host (the co
203d0 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74  nch ensures that
203e0 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68   they all use th
203f0 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63  e same local loc
20400 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 54  k file)..**.** T
20410 68 65 72 65 20 69 73 20 61 20 74 68 69 72 64 20  here is a third 
20420 66 69 6c 65 20 2d 20 74 68 65 20 68 6f 73 74 20  file - the host 
20430 49 44 20 66 69 6c 65 20 2d 20 75 73 65 64 20 61  ID file - used a
20440 73 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 72  s a persistent r
20450 65 63 6f 72 64 0a 2a 2a 20 6f 66 20 61 20 75 6e  ecord.** of a un
20460 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72 20  ique identifier 
20470 66 6f 72 20 74 68 65 20 68 6f 73 74 2c 20 61 20  for the host, a 
20480 31 32 38 2d 62 79 74 65 20 75 6e 69 71 75 65 20  128-byte unique 
20490 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
204a0 69 6e 20 74 68 65 20 70 61 74 68 20 64 65 66 69  in the path defi
204b0 6e 65 64 20 62 79 20 74 68 65 20 48 4f 53 54 49  ned by the HOSTI
204c0 44 50 41 54 48 20 6d 61 63 72 6f 20 28 64 65 66  DPATH macro (def
204d0 61 75 6c 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  ault value is.**
204e0 20 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65 73   /Library/Caches
204f0 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c 69  /.com.apple.sqli
20500 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 29 2e 0a  teConchHostId)..
20510 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
20520 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
20530 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
20540 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
20550 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
20560 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
20570 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
20580 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
20590 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
205a0 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
205b0 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
205c0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
205d0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
205e0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
205f0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
20600 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
20610 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
20620 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
20630 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
20640 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
20650 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
20660 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
20670 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
20680 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
20690 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
206a0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
206b0 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
206c0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
206d0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
206e0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
206f0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
20700 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
20710 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
20720 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
20730 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
20740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20750 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
20760 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
20770 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
20780 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
20790 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
207a0 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
207b0 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
207c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
207d0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
207e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
207f0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
20800 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
20810 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
20820 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
20830 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
20840 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
20850 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
20860 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
20870 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
20880 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
20890 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
208a0 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
208b0 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
208c0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
208d0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
208e0 0a 2a 2a 20 20 48 4f 53 54 49 44 50 41 54 48 0a  .**  HOSTIDPATH.
208f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
20900 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
20910 74 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20 70  t host ID file p
20920 61 74 68 20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 0a  ath location.**.
20930 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
20940 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
20950 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
20960 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
20970 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
20980 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
20990 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
209a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
209b0 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
209c0 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
209d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
209e0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
209f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
20a00 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
20a10 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
20a20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
20a30 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
20a40 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
20a50 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
20a60 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
20a70 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
20a80 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
20a90 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
20aa0 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
20ab0 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
20ac0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
20ad0 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
20ae0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
20af0 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
20b00 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
20b10 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
20b20 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
20b30 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
20b40 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
20b50 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
20b60 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
20b70 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
20b80 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
20b90 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
20ba0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
20bb0 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
20bc0 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
20bd0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
20be0 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
20bf0 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
20c00 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
20c10 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
20c20 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
20c30 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
20c40 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
20c50 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
20c60 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
20c70 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52  if defined(__DAR
20c80 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  WIN__) && SQLITE
20c90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
20ca0 53 54 59 4c 45 0a 0a 23 69 66 64 65 66 20 53 51  STYLE..#ifdef SQ
20cb0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
20cc0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
20cd0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
20ce0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
20cf0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
20d00 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
20d10 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
20d20 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
20d30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
20d40 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
20d50 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
20d60 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
20d70 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
20d80 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
20d90 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
20da0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
20db0 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
20dc0 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
20dd0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
20de0 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
20df0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
20e00 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
20e10 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nch file */.  ch
20e20 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74  ar *conchFilePat
20e30 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
20e40 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
20e50 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
20e60 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20  le *lockProxy;  
20e70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
20e80 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
20e90 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72  /.  char *lockPr
20ea0 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20  oxyPath;        
20eb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
20ec0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
20ed0 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  */.  char *dbPat
20ee0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
20ef0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
20f00 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
20f10 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20  int conchHeld;  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f30 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 63  True if the conc
20f40 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68  h is currently h
20f50 65 6c 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  eld */.  void *o
20f60 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
20f70 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
20f80 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
20f90 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
20fa0 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
20fb0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
20fc0 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
20fd0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
20fe0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
20ff0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
21000 48 4f 53 54 49 44 4c 45 4e 20 61 6e 64 20 43 4f  HOSTIDLEN and CO
21010 4e 43 48 4c 45 4e 20 62 6f 74 68 20 69 6e 63 6c  NCHLEN both incl
21020 75 64 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ude space for th
21030 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20 74 65 72  e string .** ter
21040 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 20 0a 2a 2f  minating nul .*/
21050 0a 23 64 65 66 69 6e 65 20 48 4f 53 54 49 44 4c  .#define HOSTIDL
21060 45 4e 20 20 20 20 20 20 20 20 20 31 32 38 0a 23  EN         128.#
21070 64 65 66 69 6e 65 20 43 4f 4e 43 48 4c 45 4e 20  define CONCHLEN 
21080 20 20 20 20 20 20 20 20 20 28 4d 41 58 50 41 54           (MAXPAT
21090 48 4c 45 4e 2b 48 4f 53 54 49 44 4c 45 4e 2b 31  HLEN+HOSTIDLEN+1
210a0 29 0a 23 69 66 6e 64 65 66 20 48 4f 53 54 49 44  ).#ifndef HOSTID
210b0 50 41 54 48 0a 23 20 64 65 66 69 6e 65 20 48 4f  PATH.# define HO
210c0 53 54 49 44 50 41 54 48 20 20 20 20 20 20 20 22  STIDPATH       "
210d0 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65 73 2f  /Library/Caches/
210e0 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c 69 74  .com.apple.sqlit
210f0 65 43 6f 6e 63 68 48 6f 73 74 49 64 22 0a 23 65  eConchHostId".#e
21100 6e 64 69 66 0a 0a 2f 2a 20 62 61 73 69 63 61 6c  ndif../* basical
21110 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 75 6e 69  ly a copy of uni
21120 78 52 61 6e 64 6f 6d 6e 65 73 73 20 77 69 74 68  xRandomness with
21130 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 74 65   different.** te
21140 73 74 20 62 65 68 61 76 69 6f 72 20 62 75 69 6c  st behavior buil
21150 74 20 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  t in */.static i
21160 6e 74 20 70 72 6f 78 79 47 65 6e 65 72 61 74 65  nt proxyGenerate
21170 48 6f 73 74 49 44 28 63 68 61 72 20 2a 70 48 6f  HostID(char *pHo
21180 73 74 49 44 29 7b 0a 20 20 69 6e 74 20 70 69 64  stID){.  int pid
21190 2c 20 66 64 2c 20 6c 65 6e 3b 0a 20 20 75 6e 73  , fd, len;.  uns
211a0 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
211b0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
211c0 20 2a 29 70 48 6f 73 74 49 44 3b 0a 20 20 0a 20   *)pHostID;.  . 
211d0 20 6d 65 6d 73 65 74 28 6b 65 79 2c 20 30 2c 20   memset(key, 0, 
211e0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 6c 65  HOSTIDLEN);.  le
211f0 6e 20 3d 20 30 3b 0a 20 20 66 64 20 3d 20 6f 70  n = 0;.  fd = op
21200 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
21210 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  ", O_RDONLY);.  
21220 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
21230 20 6c 65 6e 20 3d 20 72 65 61 64 28 66 64 2c 20   len = read(fd, 
21240 6b 65 79 2c 20 48 4f 53 54 49 44 4c 45 4e 29 3b  key, HOSTIDLEN);
21250 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20  .    close(fd); 
21260 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
21270 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66 61   the fd if it fa
21280 69 6c 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ils */.  }.  if(
21290 20 6c 65 6e 20 3c 20 48 4f 53 54 49 44 4c 45 4e   len < HOSTIDLEN
212a0 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f 74 20 74   ){.    time_t t
212b0 3b 0a 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a  ;.    time(&t);.
212c0 20 20 20 20 6d 65 6d 63 70 79 28 6b 65 79 2c 20      memcpy(key, 
212d0 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
212e0 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
212f0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
21300 6b 65 79 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  key[sizeof(t)], 
21310 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
21320 29 29 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 64 65  ));.  }.  .#ifde
21330 66 20 4d 41 4b 45 5f 50 52 45 54 54 59 5f 48 4f  f MAKE_PRETTY_HO
21340 53 54 49 44 0a 20 20 7b 0a 20 20 20 20 69 6e 74  STID.  {.    int
21350 20 69 3b 0a 20 20 20 20 2f 2a 20 66 69 6c 74 65   i;.    /* filte
21360 72 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  r the bytes into
21370 20 70 72 69 6e 74 61 62 6c 65 20 61 73 63 69 69   printable ascii
21380 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20   characters and 
21390 4e 55 4c 20 74 65 72 6d 69 6e 61 74 65 20 2a 2f  NUL terminate */
213a0 0a 20 20 20 20 6b 65 79 5b 28 48 4f 53 54 49 44  .    key[(HOSTID
213b0 4c 45 4e 2d 31 29 5d 20 3d 20 30 78 30 30 3b 0a  LEN-1)] = 0x00;.
213c0 20 20 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c      for( i=0; i<
213d0 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 3b 20 69  (HOSTIDLEN-1); i
213e0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  ++ ){.      unsi
213f0 67 6e 65 64 20 63 68 61 72 20 70 61 20 3d 20 6b  gned char pa = k
21400 65 79 5b 69 5d 26 30 78 37 46 3b 0a 20 20 20 20  ey[i]&0x7F;.    
21410 20 20 69 66 28 20 70 61 3c 30 78 32 30 20 29 7b    if( pa<0x20 ){
21420 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d 20  .        key[i] 
21430 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d  = (key[i]&0x80 =
21440 3d 20 30 78 38 30 29 20 3f 20 70 61 2b 30 78 34  = 0x80) ? pa+0x4
21450 30 20 3a 20 70 61 2b 30 78 32 30 3b 0a 20 20 20  0 : pa+0x20;.   
21460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61 3d     }else if( pa=
21470 3d 30 78 37 46 20 29 7b 0a 20 20 20 20 20 20 20  =0x7F ){.       
21480 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b 69   key[i] = (key[i
21490 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29 20  ]&0x80 == 0x80) 
214a0 3f 20 70 61 3d 30 78 32 30 20 3a 20 70 61 2b 30  ? pa=0x20 : pa+0
214b0 78 37 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x7E;.      }.   
214c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
214d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
214e0 3b 0a 7d 0a 0a 2f 2a 20 77 72 69 74 65 73 20 74  ;.}../* writes t
214f0 68 65 20 68 6f 73 74 20 69 64 20 70 61 74 68 20  he host id path 
21500 74 6f 20 70 61 74 68 2c 20 70 61 74 68 20 73 68  to path, path sh
21510 6f 75 6c 64 20 62 65 20 61 6e 20 70 72 65 2d 61  ould be an pre-a
21520 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 0a  llocated buffer.
21530 2a 2a 20 77 69 74 68 20 65 6e 6f 75 67 68 20 73  ** with enough s
21540 70 61 63 65 20 66 6f 72 20 61 20 70 61 74 68 20  pace for a path 
21550 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21560 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 50 61  proxyGetHostIDPa
21570 74 68 28 63 68 61 72 20 2a 70 61 74 68 2c 20 73  th(char *path, s
21580 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20 20 73 74  ize_t len){.  st
21590 72 6c 63 70 79 28 70 61 74 68 2c 20 48 4f 53 54  rlcpy(path, HOST
215a0 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b 0a 23 69  IDPATH, len);.#i
215b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
215c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
215d0 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29 7b 0a 20  ostid_num>0 ){. 
215e0 20 20 20 63 68 61 72 20 73 75 66 66 69 78 5b 32     char suffix[2
215f0 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73 75 66  ] = "1";.    suf
21600 66 69 78 5b 30 5d 20 3d 20 73 75 66 66 69 78 5b  fix[0] = suffix[
21610 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f 68 6f 73  0] + sqlite3_hos
21620 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20 73 74 72  tid_num;.    str
21630 6c 63 61 74 28 70 61 74 68 2c 20 73 75 66 66 69  lcat(path, suffi
21640 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e  x, len);.  }.#en
21650 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33 28 22  dif.  OSTRACE3("
21660 47 45 54 48 4f 53 54 49 44 50 41 54 48 20 20 25  GETHOSTIDPATH  %
21670 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 61 74  s pid=%d\n", pat
21680 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 7d 0a  h, getpid());.}.
21690 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
216a0 20 49 44 20 66 72 6f 6d 20 61 20 73 71 6c 69 74   ID from a sqlit
216b0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 73 74  e hostid file st
216c0 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ored in the .** 
216d0 75 73 65 72 2d 73 70 65 63 69 66 69 63 20 74 6d  user-specific tm
216e0 70 20 64 69 72 65 63 74 6f 72 79 2c 20 63 72 65  p directory, cre
216f0 61 74 65 20 74 68 65 20 49 44 20 69 66 20 69 74  ate the ID if it
21700 27 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  's not there alr
21710 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74 69 63 20  eady .*/.static 
21720 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
21730 49 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ID(char *pHostID
21740 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
21750 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
21760 20 70 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e   path[MAXPATHLEN
21770 5d 3b 20 0a 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ]; .  size_t len
21780 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c 49 54  ;.  int rc=SQLIT
21790 45 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 78 79 47 65  E_OK;..  proxyGe
217a0 74 48 6f 73 74 49 44 50 61 74 68 28 70 61 74 68  tHostIDPath(path
217b0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
217c0 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
217d0 65 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69  e the host ID fi
217e0 6c 65 2c 20 69 66 20 69 74 20 61 6c 72 65 61 64  le, if it alread
217f0 79 20 65 78 69 73 74 73 20 72 65 61 64 20 74 68  y exists read th
21800 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
21810 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
21820 4f 5f 43 52 45 41 54 7c 4f 5f 57 52 4f 4e 4c 59  O_CREAT|O_WRONLY
21830 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34 29 3b 0a  |O_EXCL, 0644);.
21840 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
21850 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
21860 0a 09 09 0a 20 20 20 20 69 66 28 20 65 72 72 21  ....    if( err!
21870 3d 45 45 58 49 53 54 20 29 7b 0a 23 69 66 64 65  =EEXIST ){.#ifde
21880 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44  f SQLITE_PROXY_D
21890 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20  EBUG /* set the 
218a0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73  sqlite error mes
218b0 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a  sage instead */.
218c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
218d0 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72  derr, "sqlite er
218e0 72 6f 72 20 63 72 65 61 74 69 6e 67 20 68 6f 73  ror creating hos
218f0 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73  t ID file %s: %s
21900 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21910 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f     path, strerro
21920 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a  r(err));.#endif.
21930 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21940 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a  ITE_PERM;.    }.
21950 20 20 20 20 2f 2a 20 63 6f 75 6c 64 6e 27 74 20      /* couldn't 
21960 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
21970 20 72 65 61 64 20 69 74 20 69 6e 73 74 65 61 64   read it instead
21980 20 2a 2f 0a 20 20 20 20 66 64 20 3d 20 6f 70 65   */.    fd = ope
21990 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59  n(path, O_RDONLY
219a0 7c 4f 5f 45 58 43 4c 29 3b 0a 20 20 20 20 69 66  |O_EXCL);.    if
219b0 28 20 66 64 3c 30 20 29 7b 0a 23 69 66 64 65 66  ( fd<0 ){.#ifdef
219c0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
219d0 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20 73  BUG /* set the s
219e0 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  qlite error mess
219f0 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20  age instead */. 
21a00 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
21a10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 66 70 72 69  rrno;.      fpri
21a20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
21a30 69 74 65 20 65 72 72 6f 72 20 6f 70 65 6e 69 6e  ite error openin
21a40 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20 25  g host ID file %
21a50 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s: %s\n",.      
21a60 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 73 74          path, st
21a70 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 23 65  rerror(err));.#e
21a80 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
21a90 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
21aa0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 70     }.    len = p
21ab0 72 65 61 64 28 66 64 2c 20 70 48 6f 73 74 49 44  read(fd, pHostID
21ac0 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29 3b  , HOSTIDLEN, 0);
21ad0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29  .    if( len<0 )
21ae0 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
21af0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
21b00 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21b10 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65  _READ;.    }else
21b20 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44 4c   if( len<HOSTIDL
21b30 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  EN ){.      *pEr
21b40 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ror = 0;.      r
21b50 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21b60 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 20  _SHORT_READ;.   
21b70 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29   }.    close(fd)
21b80 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
21b90 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20  ak the fd if it 
21ba0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54  fails */.    OST
21bb0 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44  RACE3("GETHOSTID
21bc0 20 20 72 65 61 64 20 25 73 20 70 69 64 3d 25 64    read %s pid=%d
21bd0 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65  \n", pHostID, ge
21be0 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74  tpid());.    ret
21bf0 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  urn rc;.  }else{
21c00 0a 20 20 20 20 2f 2a 20 77 65 27 72 65 20 63 72  .    /* we're cr
21c10 65 61 74 69 6e 67 20 74 68 65 20 68 6f 73 74 20  eating the host 
21c20 49 44 20 66 69 6c 65 20 28 75 73 65 20 61 20 72  ID file (use a r
21c30 61 6e 64 6f 6d 20 73 74 72 69 6e 67 20 6f 66 20  andom string of 
21c40 62 79 74 65 73 29 20 2a 2f 0a 20 20 20 20 70 72  bytes) */.    pr
21c50 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49  oxyGenerateHostI
21c60 44 28 70 48 6f 73 74 49 44 29 3b 0a 20 20 20 20  D(pHostID);.    
21c70 6c 65 6e 20 3d 20 70 77 72 69 74 65 28 66 64 2c  len = pwrite(fd,
21c80 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49 44   pHostID, HOSTID
21c90 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  LEN, 0);.    if(
21ca0 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
21cb0 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b  *pError = errno;
21cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21cd0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
21ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
21cf0 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  n<HOSTIDLEN ){. 
21d00 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30       *pError = 0
21d10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
21d20 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
21d30 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
21d40 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
21d50 79 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69 66  y leak the fd if
21d60 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20   it fails */.   
21d70 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48 4f   OSTRACE3("GETHO
21d80 53 54 49 44 20 20 77 72 6f 74 65 20 25 73 20 70  STID  wrote %s p
21d90 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f 73 74 49  id=%d\n", pHostI
21da0 44 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  D, getpid());.  
21db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21dc0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
21dd0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
21de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
21df0 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
21e00 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b   size_t maxLen){
21e10 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
21e20 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69  t dbLen;.  int i
21e30 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52  ;..#ifdef LOCKPR
21e40 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73  OXYDIR.  len = s
21e50 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f  trlcpy(lPath, LO
21e60 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c  CKPROXYDIR, maxL
21e70 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  en);.#else.# ifd
21e80 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  ef _CS_DARWIN_US
21e90 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a  ER_TEMP_DIR.  {.
21ea0 20 20 20 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f      confstr(_CS_
21eb0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
21ec0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
21ed0 4c 65 6e 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  Len);.    len = 
21ee0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
21ef0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
21f00 61 78 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  axLen);.    if( 
21f10 6d 6b 64 69 72 28 6c 50 61 74 68 2c 20 53 51 4c  mkdir(lPath, SQL
21f20 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
21f30 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
21f40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  ) ){.      /* if
21f50 20 6d 6b 64 69 72 20 66 61 69 6c 73 2c 20 68 61   mkdir fails, ha
21f60 6e 64 6c 65 20 61 73 20 6c 6f 63 6b 20 66 69 6c  ndle as lock fil
21f70 65 20 63 72 65 61 74 69 6f 6e 20 66 61 69 6c 75  e creation failu
21f80 72 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  re */.      int 
21f90 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 23 20 20  err = errno;.#  
21fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21fb0 55 47 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  UG.      if( err
21fc0 21 3d 45 45 58 49 53 54 20 29 7b 0a 20 20 20 20  !=EEXIST ){.    
21fd0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
21fe0 72 72 2c 20 22 70 72 6f 78 79 47 65 74 4c 6f 63  rr, "proxyGetLoc
21ff0 6b 50 61 74 68 3a 20 6d 6b 64 69 72 28 25 73 2c  kPath: mkdir(%s,
22000 30 25 6f 29 20 65 72 72 6f 72 20 25 64 20 25 73  0%o) error %d %s
22010 5c 6e 22 2c 20 6c 50 61 74 68 2c 0a 20 20 20 20  \n", lPath,.    
22020 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
22030 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
22040 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2c  DIR_PERMISSIONS,
22050 20 65 72 72 2c 20 73 74 72 65 72 72 6f 72 28 65   err, strerror(e
22060 72 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 20  rr));.      }.# 
22070 20 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65   endif.    }else
22080 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  {.      OSTRACE3
22090 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 6d  ("GETLOCKPATH  m
220a0 6b 64 69 72 20 25 73 20 70 69 64 3d 25 64 5c 6e  kdir %s pid=%d\n
220b0 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64  ", lPath, getpid
220c0 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  ());.    }.    .
220d0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
220e0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
220f0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
22100 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
22110 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
22120 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
22130 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
22140 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
22150 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
22160 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
22170 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
22180 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
22190 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
221a0 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
221b0 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
221c0 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
221d0 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  )<maxLen; i++){.
221e0 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
221f0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
22200 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
22210 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
22220 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
22230 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
22240 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
22250 61 78 4c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  axLen);.  return
22260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22270 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
22280 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
22290 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
222a0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
222b0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
222c0 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
222d0 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
222e0 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
222f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
22300 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
22310 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
22320 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
22330 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
22340 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
22350 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
22360 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
22370 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
22380 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
22390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
223a0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
223b0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  le(const char *p
223c0 61 74 68 2c 20 75 6e 69 78 46 69 6c 65 20 2a 2a  ath, unixFile **
223d0 70 70 46 69 6c 65 29 20 7b 0a 20 20 69 6e 74 20  ppFile) {.  int 
223e0 66 64 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20  fd;.  int dirfd 
223f0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
22400 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
22410 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22420 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
22430 79 56 66 73 3b 0a 0a 20 20 66 64 20 3d 20 6f 70  yVfs;..  fd = op
22440 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 57 52 20  en(path, O_RDWR 
22450 7c 20 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54  | O_CREAT, SQLIT
22460 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
22470 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
22480 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
22490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
224a0 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 0a 20 20  TOPEN;.  }.  .  
224b0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
224c0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
224d0 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  c(sizeof(unixFil
224e0 65 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e));.  if( pNew=
224f0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
22500 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22510 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65      goto end_cre
22520 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20  ate_proxy;.  }. 
22530 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
22540 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
22550 29 29 3b 0a 0a 20 20 64 75 6d 6d 79 56 66 73 2e  ));..  dummyVfs.
22560 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
22570 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
22580 64 65 72 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  der;.  rc = fill
22590 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
225a0 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  yVfs, fd, dirfd,
225b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
225c0 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30  pNew, path, 0, 0
225d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
225e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
225f0 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20  pFile = pNew;.  
22600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22610 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61  OK;.  }.end_crea
22620 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20  te_proxy:    .  
22630 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
22640 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69  lently leak fd i
22650 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61  f error, we're a
22660 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20  lready in error 
22670 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
22680 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
22690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 74 61 6b 65  n rc;.}../* take
226a0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
226b0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
226c0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
226d0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
226e0 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
226f0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
22700 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
22710 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
22720 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
22730 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
22740 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
22750 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
22760 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
22770 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
22780 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
22790 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
227a0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
227b0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
227c0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
227d0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
227e0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
227f0 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
22800 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
22810 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
22820 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
22830 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
22840 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
22850 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
22860 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
22870 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
22880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22890 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
228a0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
228b0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
228c0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 63 68  onchFile;.    ch
228d0 61 72 20 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e  ar testValue[CON
228e0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
228f0 20 63 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43   conchValue[CONC
22900 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
22910 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
22920 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
22930 74 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  tLockPath = NULL
22940 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
22950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
22960 74 20 72 65 61 64 52 63 20 3d 20 53 51 4c 49 54  t readRc = SQLIT
22970 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79  E_OK;.    int sy
22980 6e 63 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20  ncPerms = 0;..  
22990 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45    OSTRACE4("TAKE
229a0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
229b0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
229c0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
229d0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
229e0 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
229f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
22a00 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
22a10 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72  etpid());..    r
22a20 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
22a30 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
22a40 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
22a50 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
22a60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
22a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22a80 20 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20       int pError 
22a90 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
22aa0 74 28 74 65 73 74 56 61 6c 75 65 2c 20 30 2c 20  t(testValue, 0, 
22ab0 43 4f 4e 43 48 4c 45 4e 29 3b 20 2f 2a 20 63 6f  CONCHLEN); /* co
22ac0 6e 63 68 20 69 73 20 66 69 78 65 64 20 73 69 7a  nch is fixed siz
22ad0 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  e */.      rc = 
22ae0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 74  proxyGetHostID(t
22af0 65 73 74 56 61 6c 75 65 2c 20 26 70 45 72 72 6f  estValue, &pErro
22b00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72  r);.      if( (r
22b10 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
22b20 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 20  IOERR ){.       
22b30 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
22b40 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
22b50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
22b60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
22b70 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  h ){.        str
22b80 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b  lcpy(&testValue[
22b90 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74 78  HOSTIDLEN], pCtx
22ba0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
22bb0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
22bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22bd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22be0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
22bf0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
22c00 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72 65     }.    .    re
22c10 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64 28  adRc = unixRead(
22c20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
22c30 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63 68  conchFile, conch
22c40 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c  Value, CONCHLEN,
22c50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61   0);.    if( rea
22c60 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  dRc!=SQLITE_IOER
22c70 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
22c80 20 20 20 20 20 20 69 66 28 20 72 65 61 64 52 63        if( readRc
22c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22ca0 20 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30         if( (rc&0
22cb0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
22cc0 52 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RR ){.          
22cd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
22ce0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
22cf0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
22d00 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
22d10 72 65 61 64 52 63 3b 0a 20 20 20 20 20 20 20 20  readRc;.        
22d20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
22d30 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
22d40 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
22d50 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61  h has data compa
22d60 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
22d70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
22d80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
22d90 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
22da0 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c  for auto-named l
22db0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20  ocal lock file, 
22dc0 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68  just check the h
22dd0 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c  ost ID and we'll
22de0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  .         ** use
22df0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
22e00 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
22e10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
22e20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  e */.        if(
22e30 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61 6c   !memcmp(testVal
22e40 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20  ue, conchValue, 
22e50 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
22e60 20 20 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74          tLockPat
22e70 68 20 3d 20 28 63 68 61 72 20 2a 29 26 63 6f 6e  h = (char *)&con
22e80 63 68 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45  chValue[HOSTIDLE
22e90 4e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  N];.          go
22ea0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
22eb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22ed0 20 2f 2a 20 77 65 27 76 65 20 67 6f 74 20 74 68   /* we've got th
22ee0 65 20 63 6f 6e 63 68 20 69 66 20 63 6f 6e 63 68  e conch if conch
22ef0 56 61 6c 75 65 20 6d 61 74 63 68 65 73 20 6f 75  Value matches ou
22f00 72 20 70 61 74 68 20 61 6e 64 20 68 6f 73 74 20  r path and host 
22f10 49 44 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ID */.        if
22f20 28 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61  ( !memcmp(testVa
22f30 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c  lue, conchValue,
22f40 20 43 4f 4e 43 48 4c 45 4e 29 20 29 7b 0a 20 20   CONCHLEN) ){.  
22f50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22f60 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
22f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
22f90 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6d  * a short read m
22fa0 65 61 6e 73 20 77 65 27 72 65 20 22 63 72 65 61  eans we're "crea
22fb0 74 69 6e 67 22 20 74 68 65 20 63 6f 6e 63 68 20  ting" the conch 
22fc0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20  (even though it 
22fd0 63 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20  could .      ** 
22fe0 68 61 76 65 20 62 65 65 6e 20 75 73 65 72 2d 69  have been user-i
22ff0 6e 74 65 72 76 65 6e 74 69 6f 6e 29 2c 20 69 66  ntervention), if
23000 20 77 65 20 61 63 71 75 69 72 65 20 74 68 65 20   we acquire the 
23010 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 0a  exclusive lock,.
23020 20 20 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74        ** we'll t
23030 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
23040 63 75 72 72 65 6e 74 20 6f 6e 2d 64 69 73 6b 20  current on-disk 
23050 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74  permissions of t
23060 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
23070 20 20 2a 2f 0a 20 20 20 20 20 20 73 79 6e 63 50    */.      syncP
23080 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  erms = 1;.    }.
23090 20 20 20 20 0a 20 20 20 20 2f 2a 20 65 69 74 68      .    /* eith
230a0 65 72 20 63 6f 6e 63 68 20 77 61 73 20 65 6d 74  er conch was emt
230b0 70 79 20 6f 72 20 64 69 64 6e 27 74 20 6d 61 74  py or didn't mat
230c0 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  ch */.    if( !p
230d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
230e0 74 68 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 78  th ){.      prox
230f0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
23100 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
23110 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
23120 3b 0a 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74  ;.      tLockPat
23130 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
23140 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65 73      strlcpy(&tes
23150 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e  tValue[HOSTIDLEN
23160 5d 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  ], lockPath, MAX
23170 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 7d 0a  PATHLEN);.    }.
23180 20 20 20 20 0a 20 20 20 20 2f 2a 20 75 70 64 61      .    /* upda
23190 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f  te conch with ho
231a0 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69  st and path (thi
231b0 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f  s will fail if o
231c0 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
231d0 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
231e0 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 20  d lock already) 
231f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  */.    rc = conc
23200 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
23210 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
23220 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
23230 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
23240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23260 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
23270 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
23280 6f 6e 63 68 46 69 6c 65 2c 20 74 65 73 74 56 61  onchFile, testVa
23290 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20 30  lue, CONCHLEN, 0
232a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
232b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 79  =SQLITE_OK && sy
232c0 6e 63 50 65 72 6d 73 20 29 7b 0a 20 20 20 20 20  ncPerms ){.     
232d0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
232e0 75 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  uf;.        int 
232f0 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
23300 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
23310 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20       if( err==0 
23320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
23330 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
23340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
23350 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f  ermissions, igno
23360 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69  re failure */.#i
23370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f  fndef SQLITE_PRO
23380 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20  XY_DEBUG.       
23390 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
233a0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d  ile->h, buf.st_m
233b0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
233c0 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
233d0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
233e0 75 66 2e 73 74 5f 6d 6f 64 65 29 21 3d 30 20 29  uf.st_mode)!=0 )
233f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
23400 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
23410 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
23420 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
23430 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69  mod %o FAILED wi
23440 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  th %d %s\n",.   
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 20 20 20 20 20 20 20 20 20 62 75 66 2e 73 74            buf.st
23470 5f 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72  _mode, code, str
23480 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20  error(code));.  
23490 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
234a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
234b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
234c0 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
234d0 5c 6e 22 2c 62 75 66 2e 73 74 5f 6d 6f 64 65 29  \n",buf.st_mode)
234e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
234f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23500 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
23510 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
23520 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
23530 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b  r, "STAT FAILED[
23540 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e  %d] with %d %s\n
23550 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
23570 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  r, code, strerro
23580 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66  r(code));.#endif
23590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
235a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e   }.    }.    con
235b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
235c0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
235d0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
235e0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
235f0 0a 20 20 0a 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  .  .end_takeconc
23600 68 3a 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  h:.    OSTRACE2(
23610 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
23620 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
23630 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ->h);.    if( rc
23640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
23650 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
23660 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
23670 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64  le->h>=0 ){.#ifd
23680 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f  ef STRICT_CLOSE_
23690 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 69 66  ERROR.        if
236a0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
236b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
236c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
236d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
236e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
236f0 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
23700 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
23710 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c        close(pFil
23720 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e->h); /* silent
23730 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61  ly leak fd if fa
23740 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  il */.#endif.   
23750 20 20 20 7d 0a 20 20 20 20 20 20 70 46 69 6c 65     }.      pFile
23760 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
23770 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43  int fd = open(pC
23780 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
23790 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
237c0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
237d0 53 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  S);.      OSTRAC
237e0 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E2("TRANSPROXY: 
237f0 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
23800 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d  ;.      if( fd>=
23810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
23820 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
23830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23840 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
23850 50 45 4e 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  PEN; /* SQLITE_B
23860 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
23870 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
238a0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
238b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
238c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
238d0 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  && !pCtx->lockPr
238e0 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 63 68 61  oxy ){.      cha
238f0 72 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63 6b 50  r *path = tLockP
23900 61 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74 68 20  ath ? tLockPath 
23910 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
23920 79 50 61 74 68 3b 0a 20 20 20 20 20 20 2f 2a 20  yPath;.      /* 
23930 41 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d 61 6b  ACS: Need to mak
23940 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
23950 20 73 6f 6d 65 74 69 6d 65 73 20 2a 2f 0a 20 20   sometimes */.  
23960 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
23970 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
23980 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
23990 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
239a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
239b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 74 78 2d  K ){.      pCtx-
239c0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
239d0 0a 20 20 20 20 20 20 69 66 28 20 74 4c 6f 63 6b  .      if( tLock
239e0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
239f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
23a00 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
23a10 74 72 44 75 70 28 30 2c 20 74 4c 6f 63 6b 50 61  trDup(0, tLockPa
23a20 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
23a30 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
23a40 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
23a50 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
23a60 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63          ((afpLoc
23a70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
23a80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
23a90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
23aa0 64 62 50 61 74 68 20 3d 0a 20 20 20 20 20 20 20  dbPath =.       
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23ac0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
23ad0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
23ae0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
23af0 7b 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c  {.      conchFil
23b00 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
23b10 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
23b20 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
23b30 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
23b40 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45    OSTRACE3("TAKE
23b50 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
23b60 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72   conchFile->h, r
23b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
23b80 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ":"failed");.   
23b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23ba0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
23bb0 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
23bc0 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
23bd0 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
23be0 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
23bf0 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
23c00 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
23c10 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
23c20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
23c30 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
23c40 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
23c50 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
23c60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
23c70 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
23c80 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
23c90 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
23ca0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
23cb0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
23cc0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
23cd0 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
23ce0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
23cf0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
23d00 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
23d10 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
23d20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
23d30 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45  ;.  OSTRACE4("RE
23d40 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
23d50 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
23d60 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
23d70 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
23d80 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
23d90 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
23da0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
23db0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
23dc0 74 70 69 64 28 29 29 3b 0a 20 20 70 43 74 78 2d  tpid());.  pCtx-
23dd0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
23de0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
23df0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
23e00 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
23e10 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
23e20 4c 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41 43 45  LOCK);.  OSTRACE
23e30 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  3("RELEASECONCH 
23e40 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
23e50 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
23e60 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
23e70 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
23e80 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
23e90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
23ea0 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
23eb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
23ec0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
23ed0 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
23ee0 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
23ef0 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
23f00 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
23f10 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
23f20 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
23f30 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
23f40 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
23f50 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
23f60 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
23f70 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
23f80 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
23f90 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
23fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23fb0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
23fc0 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
23fd0 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
23fe0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
23ff0 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
24000 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
24010 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
24020 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
24030 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
24040 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
24050 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
24060 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
24070 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
24080 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
24090 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
240c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
240d0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
240e0 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
240f0 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
24100 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
24110 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
24120 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
24130 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
24140 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
24150 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
24160 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
24170 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
24180 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
24190 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
241a0 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
241b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
241c0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
241d0 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
241e0 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
241f0 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
24200 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
24210 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
24220 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
24230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24240 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
24250 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
24260 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
24270 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
24280 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
24290 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
242a0 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
242b0 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
242c0 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
242d0 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
242e0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
242f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24300 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
24310 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
24320 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
24330 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
24340 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
24350 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
24360 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
24370 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
24380 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
24390 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
243a0 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
243b0 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
243c0 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
243d0 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
243e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
243f0 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
24400 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
24410 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
24420 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
24430 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
24440 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
24450 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
24460 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
24470 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
24480 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
24490 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
244a0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
244b0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
244c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
244d0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
244e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
244f0 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
24500 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
24510 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
24520 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
24530 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
24540 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
24550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
24560 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
24570 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
24580 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
24590 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
245a0 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
245b0 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
245c0 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
245d0 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
245e0 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
245f0 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
24600 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
24610 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
24620 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
24630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24640 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
24650 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
24660 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
24670 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
24680 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
24690 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
246a0 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
246b0 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
246c0 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
246d0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
246e0 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
246f0 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
24700 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
24710 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
24720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24730 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
24740 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
24750 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
24760 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
24770 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
24780 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
24790 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
247a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
247b0 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
247c0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
247d0 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
247e0 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
247f0 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
24800 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
24810 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
24820 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
24830 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
24840 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
24850 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
24860 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
24870 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
24880 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
24890 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
248a0 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
248b0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
248c0 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
248d0 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
248e0 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20 69 66  __DARWIN__).  if
248f0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
24900 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
24910 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
24920 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
24930 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
24940 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
24950 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
24960 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
24970 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
24980 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
24990 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
249a0 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
249b0 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
249c0 74 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 28  trcpy(dbPath, ((
249d0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
249e0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
249f0 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
24a00 74 68 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  th);.  }else.#en
24a10 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
24a20 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
24a30 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
24a40 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
24a50 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
24a60 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
24a70 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
24a80 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
24a90 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
24aa0 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
24ab0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
24ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
24ad0 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
24ae0 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
24af0 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
24b00 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
24b10 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
24b20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
24b30 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
24b40 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
24b50 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
24b60 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
24b70 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
24b80 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
24b90 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
24ba0 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
24bb0 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
24bc0 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  rcpy(dbPath, (ch
24bd0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
24be0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
24bf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24c00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
24c10 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66  kes an already f
24c20 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69  illed in unix fi
24c30 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74  le and alters it
24c40 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63   so all file loc
24c50 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65  king .** will be
24c60 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
24c70 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f  e local proxy lo
24c80 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f  ck file.  The fo
24c90 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a  llowing fields.*
24ca0 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  * are preserved 
24cb0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
24cc0 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74  ontext so that t
24cd0 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
24ce0 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  red and .** the 
24cf0 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70  unix structure p
24d00 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20  roperly cleaned 
24d10 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65  up at close time
24d20 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43  :.**  ->lockingC
24d30 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65  ontext.**  ->pMe
24d40 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  thod.*/.static i
24d50 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
24d60 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
24d70 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
24d80 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
24d90 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
24da0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68  text *pCtx;.  ch
24db0 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54  ar dbPath[MAXPAT
24dc0 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f  HLEN+1];       /
24dd0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
24de0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24df0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d   char *lockPath=
24e00 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
24e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
24e20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
24e30 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
24e40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24e50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
24e60 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
24e70 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
24e80 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
24e90 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
24ea0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
24eb0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
24ec0 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
24ed0 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
24ee0 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
24ef0 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
24f00 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 52   .  OSTRACE4("TR
24f10 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
24f20 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
24f30 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
24f40 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
24f50 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
24f60 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
24f70 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
24f80 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
24f90 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
24fa0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
24fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24fc0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
24fd0 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
24fe0 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
24ff0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
25000 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
25010 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
25020 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
25030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25040 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
25050 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
25060 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
25070 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
25080 68 46 69 6c 65 29 3b 0a 20 20 7d 20 20 0a 20 20  hFile);.  }  .  
25090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
250a0 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b  K && lockPath ){
250b0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
250c0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
250d0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f  e3DbStrDup(0, lo
250e0 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  ckPath);.  }..  
250f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25100 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  K ){.    /* all 
25110 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
25120 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20  ted, proxys are 
25130 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69  created and assi
25140 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77  gned, .    ** sw
25150 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67  itch the locking
25160 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
25170 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e  thod then return
25180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74  ..    */.    pCt
25190 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69  x->dbPath = sqli
251a0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64  te3DbStrDup(0, d
251b0 62 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  bPath);.    pCtx
251c0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
251d0 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
251e0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
251f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
25200 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
25210 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
25220 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
25230 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
25240 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
25250 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
25260 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
25270 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
25280 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
25290 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
252a0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
252b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
252c0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
252d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
252e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
252f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
25300 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
25310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
25320 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
25330 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20  FilePath); .    
25340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
25350 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  x);.  }.  OSTRAC
25360 45 33 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E3("TRANSPROXY  
25370 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
25380 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
25390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
253a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
253b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
253c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
253d0 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73  outine handles s
253e0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
253f0 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74  rol() calls that
25400 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   are specific.**
25410 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   to proxy lockin
25420 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
25430 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
25440 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
25450 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
25460 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
25470 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
25480 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
25490 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
254a0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
254b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
254c0 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  )id;.      if( p
254d0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
254e0 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
254f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
25500 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
25510 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
25520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
25530 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
25540 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ext;.        pro
25550 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
25560 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
25570 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
25580 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
25590 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
255a0 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f  )pArg = pCtx->lo
255b0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
255c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
255d0 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
255e0 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61  ar **)pArg = ":a
255f0 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22  uto: (not held)"
25600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25610 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
25620 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
25630 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a  **)pArg = NULL;.
25640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
25650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25660 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
25670 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
25680 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
25690 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
256a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
256b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
256c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
256d0 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79    int isProxySty
256e0 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65  le = (pFile->pMe
256f0 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
25700 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20  Methods);.      
25710 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
25720 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
25730 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
25740 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
25750 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
25760 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
25770 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
25780 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
25790 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
257a0 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49  ITE_ERROR /*SQLI
257b0 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c  TE_PROTOCOL? SQL
257c0 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20  ITE_MISUSE?*/;. 
257d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
257e0 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
257f0 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
25800 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20  g - already off 
25810 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20  - NOOP */.      
25820 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25830 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
25840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25850 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
25860 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73  roxyPath = (cons
25870 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20  t char *)pArg;. 
25880 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
25890 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
258a0 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
258b0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
258c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
258d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
258e0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
258f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
25900 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70       if( !strcmp
25910 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29  (pArg, ":auto:")
25920 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
25930 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
25940 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20  Path &&.        
25950 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28         !strncmp(
25960 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
25970 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  ath, proxyPath, 
25980 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20  MAXPATHLEN)).   
25990 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
259a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
259b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
259c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
259d0 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f     rc = switchLo
259e0 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c  ckProxyPath(pFil
259f0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
25a00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25a20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70      /* turn on p
25a30 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
25a40 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  g */.          r
25a50 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
25a60 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  rmUnixFile(pFile
25a70 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
25a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25aa0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
25ab0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
25ac0 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65  rt( 0 );  /* The
25ad0 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68   call assures th
25ae0 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70  at only valid op
25af0 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a  codes are sent *
25b00 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  /.    }.  }.  /*
25b10 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72  NOTREACHED*/.  r
25b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25b30 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74  OR;.}../*.** Wit
25b40 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f  hin this divisio
25b50 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20  n (the proxying 
25b60 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
25b70 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63  tation) the proc
25b80 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20  edures.** above 
25b90 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61  this point are a
25ba0 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54  ll utilities.  T
25bb0 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20  he lock-related 
25bc0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a  methods of the.*
25bd0 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  * proxy-locking 
25be0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25bf0 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e  d object follow.
25c00 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .*/.../*.** This
25c10 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
25c20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
25c30 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
25c40 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
25c50 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
25c60 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
25c70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
25c80 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
25c90 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
25ca0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
25cb0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
25cc0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
25cd0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
25ce0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
25cf0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
25d00 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
25d10 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
25d20 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
25d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25d40 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
25d50 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
25d60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
25d70 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69  sOut) {.  unixFi
25d80 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
25d90 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
25da0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
25db0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
25dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25dd0 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
25de0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
25df0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
25e00 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
25e10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25e20 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
25e30 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
25e40 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 65 74  ckProxy;.    ret
25e50 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  urn proxy->pMeth
25e60 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  od->xCheckReserv
25e70 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  edLock((sqlite3_
25e80 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65  file*)proxy, pRe
25e90 73 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  sOut);.  }.  ret
25ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25eb0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
25ec0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
25ed0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
25ee0 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
25ef0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
25f00 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
25f10 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
25f20 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
25f30 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
25f40 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
25f50 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
25f60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
25f70 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
25f80 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
25f90 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
25fa0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
25fb0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
25fc0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
25fd0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
25fe0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
25ff0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
26000 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
26010 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
26020 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
26030 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
26040 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
26050 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
26060 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
26070 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
26080 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
26090 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
260a0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
260b0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
260c0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
260d0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
260e0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
260f0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
26100 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
26110 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
26120 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
26130 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
26140 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
26150 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
26160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26170 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
26180 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
26190 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
261a0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
261b0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
261c0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
261d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
261e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
261f0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
26200 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
26210 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
26220 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
26230 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
26240 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
26250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26260 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
26270 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
26280 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
26290 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
262a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
262b0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
262c0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
262d0 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  roxy;.    rc = p
262e0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
262f0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
26300 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74  le*)proxy, lockt
26310 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ype);.    pFile-
26320 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78  >locktype = prox
26330 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d  y->locktype;.  }
26340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26350 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
26360 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
26370 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
26380 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
26390 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
263a0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
263b0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
263c0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
263d0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
263e0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
263f0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
26400 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
26410 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
26420 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
26430 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
26440 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
26450 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
26460 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
26470 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
26480 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
26490 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
264a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
264b0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
264c0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
264d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
264e0 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
264f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
26500 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
26510 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
26520 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
26530 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
26540 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
26550 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20  ckProxy;.    rc 
26560 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
26570 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
26580 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
26590 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70  locktype);.    p
265a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
265b0 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65   proxy->locktype
265c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
265d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
265e0 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73  e a file that us
265f0 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a  es proxy locks..
26600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
26610 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
26620 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
26630 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
26640 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
26650 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
26660 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
26670 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
26680 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
26690 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
266a0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
266b0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
266c0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
266d0 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46  Proxy;.    unixF
266e0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
266f0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
26700 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
26710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20  QLITE_OK;.    . 
26720 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79     if( lockProxy
26730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
26740 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
26750 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
26760 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72  te3_file*)lockPr
26770 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  oxy, NO_LOCK);. 
26780 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
26790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
267a0 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
267b0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
267c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
267d0 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
267e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
267f0 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
26800 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79  3_free(lockProxy
26810 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  );.      pCtx->l
26820 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20  ockProxy = 0;.  
26830 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63    }.    if( conc
26840 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  hFile ){.      i
26850 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
26860 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ld ){.        rc
26870 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43   = proxyReleaseC
26880 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
26890 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
268a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
268b0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  .      rc = conc
268c0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
268d0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
268e0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29  file*)conchFile)
268f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
26900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26910 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
26920 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
26930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26940 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  e(pCtx->lockProx
26950 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  yPath);.    sqli
26960 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
26970 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20  onchFilePath);. 
26980 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26990 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20  pCtx->dbPath);. 
269a0 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68     /* restore th
269b0 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  e original locki
269c0 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
269d0 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73  Method then clos
269e0 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c  e it */.    pFil
269f0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
26a00 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63  t = pCtx->oldLoc
26a10 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
26a20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
26a30 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68  = pCtx->pOldMeth
26a40 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  od;.    sqlite3_
26a50 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20  free(pCtx);.    
26a60 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d  return pFile->pM
26a70 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64  ethod->xClose(id
26a80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
26aa0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
26ab0 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26  d(__DARWIN__) &&
26ac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
26ad0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
26ae0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
26af0 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73  locking style is
26b00 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
26b10 65 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73  e with AFP files
26b20 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73  ystems..** And s
26b30 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79  ince AFP is only
26b40 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61   supported on Ma
26b50 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20  cOSX, the proxy 
26b60 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a  locking is also.
26b70 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f  ** restricted to
26b80 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a   MacOSX..** .**.
26b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ba0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
26bb0 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  roxy lock implem
26bc0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
26bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
26be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
26c30 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
26c40 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
26c50 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
26c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26c70 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61  tine registers a
26c80 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ll VFS implement
26c90 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d  ations for unix-
26ca0 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a  like operating.*
26cb0 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73  * systems.  This
26cc0 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68   routine, and th
26cd0 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  e sqlite3_os_end
26ce0 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  () routine that 
26cf0 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75  follows,.** shou
26d00 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
26d10 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
26d20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69  file that are vi
26d30 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72  sible from other
26d40 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  .** files..**.**
26d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26d60 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72   called once dur
26d70 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69  ing SQLite initi
26d80 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79  alization and by
26d90 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72   a.** single thr
26da0 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ead.  The memory
26db0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20   allocation and 
26dc0 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
26dd0 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63   have not.** nec
26de0 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e  essarily been in
26df0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
26e00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
26e10 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68  alled, and so th
26e20 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74  ey.** should not
26e30 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74   be used..*/.int
26e40 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
26e50 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20  (void){ .  /* . 
26e60 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
26e70 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20  g macro defines 
26e80 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66  an initializer f
26e90 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66  or an sqlite3_vf
26ea0 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  s object..  ** T
26eb0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
26ec0 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65  FS is NAME.  The
26ed0 20 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70   pAppData is a p
26ee0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
26ef0 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ter.  ** to the 
26f00 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
26f10 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73  n.  (pAppData is
26f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
26f30 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a  pointer because.
26f40 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72    ** silly C90 r
26f50 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20  ules prohibit a 
26f60 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67  void* from being
26f70 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74   cast to a funct
26f80 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ion pointer.  **
26f90 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
26fa0 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  to go through th
26fb0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70  e intermediate p
26fc0 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20  ointer to avoid 
26fd0 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68  problems.  ** wh
26fe0 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  en compiling wit
26ff0 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
27000 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a  rs on GCC.).  **
27010 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52  .  ** The FINDER
27020 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
27030 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20  is macro is the 
27040 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  name of the poin
27050 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
27060 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e  finder-function.
27070 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e    The finder-fun
27080 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
27090 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
270a0 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65   ** sqlite_io_me
270b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61  thods object tha
270c0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
270d0 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67   desired locking
270e0 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e  .  ** behaviors.
270f0 20 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69    See the divisi
27100 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f  on above that co
27110 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54  ntains the IOMET
27120 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  HODS.  ** macro 
27130 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66  for addition inf
27140 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64  ormation on find
27150 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  er-functions..  
27160 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e  **.  ** Most fin
27170 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75  ders simply retu
27180 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27190 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
271a0 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20  io_methods.  ** 
271b0 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65  object.  But the
271c0 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   "autolockIoFind
271d0 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  er" available on
271e0 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c   MacOSX does a l
271f0 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20  ittle.  ** more 
27200 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f  than that; it lo
27210 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
27220 79 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20  ystem type that 
27230 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20  hosts the .  ** 
27240 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
27250 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73  d tries to choos
27260 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  e an locking met
27270 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20  hod appropriate 
27280 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69  for.  ** that fi
27290 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20  lesystem time.. 
272a0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e   */.  #define UN
272b0 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46  IXVFS(VFSNAME, F
272c0 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20  INDER) {        
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 5c 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20  \.    1,        
272f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
27300 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27320 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46      sizeof(unixF
27330 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
27340 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20  sFile */        
27350 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27360 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
27370 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
27380 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  hname */        
27390 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
273a0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
273b0 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
273c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
273d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46          \.    VF
273e0 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20  SNAME,          
273f0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20      /* zName */ 
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69        \.    (voi
27420 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20  d*)&FINDER,     
27430 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70      \.    unixOp
27460 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
27470 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20  /* xOpen */     
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65    \.    unixDele
274a0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
274b0 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20   xDelete */     
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73  \.    unixAccess
274e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
274f0 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20  Access */       
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27510 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68      unixFullPath
27520 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
27530 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20  llPathname */   
27540 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27550 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20    unixDlOpen,   
27560 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
27570 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  en */           
27580 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
27590 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20  unixDlError,    
275a0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
275b0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
275c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
275d0 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  ixDlSym,        
275e0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
275f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27600 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
27610 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
27620 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61      \.    unixRa
27650 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
27660 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
27670 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27680 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65    \.    unixSlee
27690 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
276a0 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20   xSleep */      
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
276d0 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
276e0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20  CurrentTime */  
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27700 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45      unixGetLastE
27710 72 72 6f 72 20 20 20 20 20 20 2f 2a 20 78 47 65  rror      /* xGe
27720 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20  tLastError */   
27730 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27740 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  }..  /*.  ** All
27750 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66   default VFSes f
27760 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74  or unix are cont
27770 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  ained in the fol
27780 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20  lowing array..  
27790 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
277a0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  t the sqlite3_vf
277b0 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  s.pNext field of
277c0 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20   the VFS object 
277d0 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a  is modified.  **
277e0 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63   by the SQLite c
277f0 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53  ore when the VFS
27800 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20   is registered. 
27810 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
27820 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e  g.  ** array can
27830 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20  not be const..  
27840 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  */.  static sqli
27850 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
27860 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   {.#if SQLITE_EN
27870 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27880 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
27890 44 41 52 57 49 4e 5f 5f 29 0a 20 20 20 20 55 4e  DARWIN__).    UN
278a0 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
278b0 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49         autolockI
278c0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65  oFinder ),.#else
278d0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
278e0 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f  ix",          po
278f0 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  sixIoFinder ),.#
27900 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46  endif.    UNIXVF
27910 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20  S("unix-none",  
27920 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65     nolockIoFinde
27930 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
27940 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c  ("unix-dotfile",
27950 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
27960 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r ),.#if OS_VXWO
27970 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28  RKS.    UNIXVFS(
27980 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c  "unix-namedsem",
27990 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a   semIoFinder ),.
279a0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
279b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
279c0 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56  _STYLE.    UNIXV
279d0 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c  FS("unix-posix",
279e0 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
279f0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
27a00 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20  ("unix-flock",  
27a10 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20    flockIoFinder 
27a20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ),.#endif.#if SQ
27a30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27a40 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
27a50 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29  ined(__DARWIN__)
27a60 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
27a70 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66  ix-afp",      af
27a80 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  pIoFinder ),.   
27a90 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
27aa0 72 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49  roxy",    proxyI
27ab0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
27ac0 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  f.  };.  unsigne
27ad0 64 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20  d int i;        
27ae0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
27af0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73  r */..  /* Regis
27b00 74 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65  ter all VFSes de
27b10 66 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66  fined in the aVf
27b20 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66  s[] array */.  f
27b30 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f  or(i=0; i<(sizeo
27b40 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73  f(aVfs)/sizeof(s
27b50 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b  qlite3_vfs)); i+
27b60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
27b70 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 61 56  vfs_register(&aV
27b80 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20  fs[i], i==0);.  
27b90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27ba0 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
27bb0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65  Shutdown the ope
27bc0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
27bd0 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  terface..**.** S
27be0 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
27bf0 73 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64  stems might need
27c00 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61   to do some clea
27c10 6e 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74  nup in this rout
27c20 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61  ine,.** to relea
27c30 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  se dynamically a
27c40 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73  llocated objects
27c50 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e  .  But not on un
27c60 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ix..** This rout
27c70 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ine is a no-op f
27c80 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20  or unix..*/.int 
27c90 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
27ca0 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20  oid){ .  return 
27cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a  SQLITE_OK; .}. .
27cc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27cd0 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a              _OS_UNIX */.