/ Hex Artifact Content
Login

Artifact bc3e50bcc7d97c0ea2b75b20bc2b5b96ed677270:


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 32 38 20 32 30 30 38 2f 31  c,v 1.228 2008/1
0810: 32 2f 30 33 20 32 32 3a 34 38 3a 33 33 20 64 72  2/03 22:48:33 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 73 74 72 6c 65 6e 28 7a  ;.  n = strlen(z
39d0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
39e0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
39f0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
3a00: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
3a10: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3a20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3a30: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
3a40: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
3a50: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
3a60: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
3a70: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
3a80: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
3a90: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
3aa0: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
3ab0: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
3ac0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
3ad0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
3ae0: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
3af0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
3b00: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
3b10: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
3b20: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
3b30: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
3b40: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
3b50: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
3b60: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
3b70: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
3b80: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
3b90: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
3ba0: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
3bb0: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
3bc0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3bd0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
3be0: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
3bf0: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
3c00: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3c10: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
3c20: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
3c30: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
3c40: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
3c50: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
3c60: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
3c70: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
3c80: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
3c90: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
3ca0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
3cb0: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
3cc0: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
3cd0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
3ce0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
3cf0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
3d00: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
3d10: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
3d20: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
3d30: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
3d40: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
3d50: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
3d60: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
3d70: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
3d80: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
3d90: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
3da0: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
3db0: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
3dc0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3dd0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
3de0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
3df0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
3e00: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
3e10: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
3e20: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
3e30: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
3e40: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
3e50: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
3e60: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
3e70: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
3e80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
3e90: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
3ea0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
3eb0: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
3ec0: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
3ed0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
3ee0: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
3ef0: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
3f00: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
3f10: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
3f20: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
3f30: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
3f40: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
3f60: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
3f70: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
3f80: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
3f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
3fa0: 2a 2a 2a 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 2f 0a 0a 0a  ************/...
3ff0: 2f 2a 2a 2a 2a 2a 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 0a  ***************.
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
4060: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
4070: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4090: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
40a0: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
40b0: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
40c0: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
40d0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
40e0: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
40f0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
4100: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
4110: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
4120: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
4130: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
4140: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
4150: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
4160: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
4170: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
4180: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
4190: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
41a0: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
41b0: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
41c0: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
41d0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
41e0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
41f0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
4200: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
4210: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
4220: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
4230: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
4240: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
4250: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4260: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
4270: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
4280: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4290: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
42a0: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
42b0: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
42c0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
42d0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
42e0: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
42f0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
4300: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
4310: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
4320: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4330: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
4340: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
4350: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
4360: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
4370: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
4380: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
4390: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
43a0: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
43b0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
43c0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
43d0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
43e0: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
43f0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
4400: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
4410: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
4420: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
4430: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
4440: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
4450: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
4460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4470: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
4480: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
4490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
44a0: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
44b0: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
44c0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
44d0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
44e0: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
44f0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
4500: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
4510: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
4520: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
4530: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
4540: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
4550: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
4560: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
4570: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
4580: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
4590: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
45a0: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
45b0: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
45c0: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
45d0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
45e0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
45f0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
4600: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
4610: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
4620: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
4630: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
4640: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
4650: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
4660: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
4670: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
4680: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
4690: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
46a0: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
46b0: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
46c0: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
46d0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
46e0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
46f0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
4700: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
4710: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
4720: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
4730: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
4740: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
4750: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
4760: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
4770: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
4780: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
4790: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
47a0: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
47b0: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
47c0: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
47d0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
47e0: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
47f0: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
4800: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
4810: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
4820: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
4830: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
4840: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
4850: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
4860: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
4870: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
4880: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
4890: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
48a0: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
48b0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
48c0: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
48d0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
48e0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
48f0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
4900: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
4910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
4920: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
4930: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
4940: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
4950: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
4960: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
4970: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
4980: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
4990: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
49a0: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
49b0: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
49c0: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
49d0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
49e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
49f0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
4a00: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
4a10: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
4a20: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4a30: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
4a40: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
4a50: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
4a60: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
4a70: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
4a80: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
4a90: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
4aa0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
4ab0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
4ac0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
4ad0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
4ae0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
4af0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
4b00: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
4b10: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
4b20: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
4b30: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
4b40: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
4b50: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
4b60: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
4b70: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
4b80: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
4b90: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
4ba0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
4bb0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
4bc0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
4bd0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
4be0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
4bf0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
4c00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
4c10: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
4c20: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
4c30: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
4c40: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
4c50: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
4c60: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
4c70: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
4c80: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
4c90: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
4ca0: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
4cb0: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
4cc0: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
4cd0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
4ce0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
4cf0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
4d00: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
4d10: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
4d20: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
4d30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e  pointer to an un
4d40: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
4d50: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
4d60: 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ne unixOpenCnt s
4d70: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
4d80: 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63  open inode, whic
4d90: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c  h means that mul
4da0: 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20 63  tiple unixFile c
4db0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  an point to a si
4dc0: 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e  ngle.** unixOpen
4dd0: 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74  Cnt.  When an at
4de0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
4df0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
4e00: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
4e10: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
4e20: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
4e30: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
4e40: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
4e50: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
4e60: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
4e70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
4e80: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
4e90: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
4ea0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
4eb0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
4ec0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
4ed0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
4ee0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
4ef0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
4f00: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
4f10: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
4f20: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
4f30: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
4f40: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
4f50: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
4f60: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
4f70: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
4f80: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
4f90: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
4fa0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
4fb0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
4fc0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
4fd0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
4fe0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
4ff0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
5000: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
5010: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
5020: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
5030: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
5040: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
5050: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
5060: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
5070: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
5080: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
5090: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
50a0: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
50b0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
50c0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
50d0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
50e0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
50f0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
5100: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
5110: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5120: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
5130: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
5140: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
5150: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
5160: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
5170: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
5180: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
5190: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
51a0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
51b0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
51c0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
51d0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
51e0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
51f0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65   thread B..** We
5200: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72 75   have to do a ru
5210: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
5220: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
5230: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
5240: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
5250: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d  .**.** On system
5260: 73 20 77 68 65 72 65 20 74 68 72 65 61 64 20 41  s where thread A
5270: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f   is unable to mo
5280: 64 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61 74  dify locks creat
5290: 65 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64 20  ed by.** thread 
52a0: 42 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65  B, we have to ke
52b0: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69 63  ep track of whic
52c0: 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64  h thread created
52d0: 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20   each.** lock.  
52e0: 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 61  Hence there is a
52f0: 6e 20 65 78 74 72 61 20 66 69 65 6c 64 20 69 6e  n extra field in
5300: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
5310: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  unixLockInfo.** 
5320: 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 63  structure to rec
5330: 6f 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  ord this informa
5340: 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68  tion.  And on th
5350: 6f 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a 2a  ose systems it.*
5360: 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  * is illegal to 
5370: 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  begin a transact
5380: 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65 61  ion in one threa
5390: 64 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74 0a  d and finish it.
53a0: 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20  ** in another.  
53b0: 46 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72 20  For this latter 
53c0: 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68 65  restriction, the
53d0: 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72  re is no work-ar
53e0: 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61  ound..** It is a
53f0: 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c   limitation of L
5400: 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a  inuxThreads..*/.
5410: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68  ./*.** Set or ch
5420: 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65  eck the unixFile
5430: 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69  .tid field.  Thi
5440: 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77  s field is set w
5450: 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a  hen an unixFile.
5460: 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  ** is first open
5470: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
5480: 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20  ent uses of the 
5490: 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20  unixFile verify 
54a0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
54b0: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
54c0: 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78  ting on the unix
54d0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
54e0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
54f0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
5500: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
5510: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
5520: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
5530: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
5540: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
5550: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
5560: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
5570: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5580: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
5590: 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65   while locks are
55a0: 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72   held..**.** Ver
55b0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
55c0: 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69  -01-15):  unixFi
55d0: 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20  le can be moved 
55e0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20  from one thread 
55f0: 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73  to.** another as
5600: 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20   long as we are 
5610: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73  running on a sys
5620: 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74  tem that support
5630: 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65  s threads.** ove
5640: 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68  rriding each oth
5650: 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68  ers locks (which
5660: 20 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74   is now the most
5670: 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72   common behavior
5680: 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f  ).** or if no lo
5690: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42  cks are held.  B
56a0: 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  ut the unixFile.
56b0: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
56c0: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
56d0: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
56e0: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
56f0: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
5700: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
5710: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
5720: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
5730: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
5740: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
5750: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
5760: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
5770: 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
5780: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29   SET_THREADID(X)
5790: 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74     (X)->tid = pt
57a0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
57b0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
57c0: 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73  ADID(X) (threads
57d0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
57e0: 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a  rsLocks==0 && \.
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68              !pth
5810: 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e  read_equal((X)->
5820: 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  tid, pthread_sel
5830: 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  f())).#else.# de
5840: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
5850: 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48  D(X).# define CH
5860: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
5870: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
5880: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
58a0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
58b0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
58c0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
58d0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e  ticular unixOpen
58e0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69  Cnt structure gi
58f0: 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20  ven its inode.  
5900: 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73  This.** is the s
5910: 61 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78 4c  ame as the unixL
5920: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68  ockKey except th
5930: 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44  at the thread ID
5940: 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a   is omitted..*/.
5950: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
5960: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
5990: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
59a0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
59b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
59c0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
59d0: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
59e0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
59f0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
5a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
5a10: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
5a20: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
5a30: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5a40: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5a50: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
5a60: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
5a70: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
5a80: 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ular unixLockInf
5a90: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
5aa0: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
5ab0: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
5ac0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
5ad0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5ae0: 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c 20  (LinuxThreads), 
5af0: 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74  then we.** set t
5b00: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74  he unixLockKey.t
5b10: 69 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  id field to the 
5b20: 74 68 72 65 61 64 20 49 44 2e 20 20 49 66 20 74  thread ID.  If t
5b30: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
5b40: 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65  ide.** each othe
5b50: 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20  rs locks (Posix 
5b60: 61 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20 74  and NPTL) then t
5b70: 69 64 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  id is always set
5b80: 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64   to zero..** tid
5b90: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 77   is omitted if w
5ba0: 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75  e compile withou
5bb0: 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70  t threading supp
5bc0: 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a  ort or on an OS.
5bd0: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69  ** other than li
5be0: 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  nux..*/.struct u
5bf0: 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73  nixLockKey {.  s
5c00: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
5c10: 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65   fid;  /* Unique
5c20: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
5c30: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20  the file */.#if 
5c40: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
5c50: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
5c60: 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61  inux__).  pthrea
5c70: 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68 72  d_t tid;  /* Thr
5c80: 65 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f  ead ID of lock o
5c90: 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f  wner. Zero if no
5ca0: 74 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68 72  t using LinuxThr
5cb0: 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  eads */.#endif.}
5cc0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
5cd0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5ce0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5cf0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
5d00: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
5d10: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
5d20: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
5d30: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
5d40: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
5d50: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
5d60: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
5d70: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
5d80: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
5d90: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
5da0: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
5db0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
5dc0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
5dd0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
5de0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
5df0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
5e00: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
5e10: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
5e20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
5e30: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
5e40: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
5e50: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b  t unixLockInfo {
5e60: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
5e70: 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20  ckKey lockKey;  
5e80: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
5e90: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
5ea0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5ec0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
5ed0: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
5ee0: 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  t locktype;     
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f00: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
5f10: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5f20: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
5f30: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f50: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
5f60: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
5f70: 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ture */.  struct
5f80: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
5f90: 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  Next;     /* Lis
5fa0: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63  t of all unixLoc
5fb0: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  kInfo objects */
5fc0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
5fd0: 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  ckInfo *pPrev;  
5fe0: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
5ff0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 7d  ubly linked */.}
6000: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
6010: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
6020: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6030: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
6040: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
6050: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
6060: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
6070: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6080: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
6090: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
60a0: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
60b0: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
60c0: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
60d0: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
60e0: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
60f0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
6100: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
6110: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
6120: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
6130: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
6140: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a 0a  ending list..**.
6150: 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69 64  ** TODO:  Consid
6160: 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  er changing this
6170: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
6180: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
6190: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
61a0: 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  or for each open
61b0: 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65 6e   file, even when
61c0: 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d 75   it is opened mu
61d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a  ltiple times..**
61e0: 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79 73   The close() sys
61f0: 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20 6f  tem call would o
6200: 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20 74  nly occur when t
6210: 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73 65  he last database
6220: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66 69  .** using the fi
6230: 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73 74  le closes..*/.st
6240: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
6250: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
6260: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
6270: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
6280: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
6290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
62a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
62b0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
62c0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
62d0: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62f0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
6300: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
6310: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6330: 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  Number of pendin
6340: 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74  g close() operat
6350: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ions */.  int *a
6360: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
6370: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
6380: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
6390: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
63a0: 6f 73 65 28 29 20 2a 2f 0a 23 69 66 20 4f 53 5f  ose() */.#if OS_
63b0: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
63c0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
63d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
63e0: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
63f0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
6400: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
6410: 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20 4e 61 6d  AME+1];   /* Nam
6420: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
6430: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ore */.#endif.  
6440: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
6450: 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  nt *pNext, *pPre
6460: 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  v;   /* List of 
6470: 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  all unixOpenCnt 
6480: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
6490: 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c  *.** Lists of al
64a0: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61  l unixLockInfo a
64b0: 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f  nd unixOpenCnt o
64c0: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 75  bjects.  These u
64d0: 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a 2a  sed to be hash.*
64e0: 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 74  * tables.  But t
64f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
6500: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
6510: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
6520: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
6530: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
6540: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
6550: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
6560: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73  itical.** path s
6570: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
6580: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
6590: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
65a0: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
65b0: 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30  fo *lockList = 0
65c0: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
65d0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65  unixOpenCnt *ope
65e0: 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nList = 0;../*.*
65f0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
6600: 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68 65  remembers whethe
6610: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
6620: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6630: 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63  ch others.** loc
6640: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ks..**.**    0: 
6650: 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61   No.  Threads ca
6660: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
6670: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6680: 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29    (LinuxThreads)
6690: 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20  .**    1:  Yes. 
66a0: 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   Threads can ove
66b0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
66c0: 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78  s locks.  (Posix
66d0: 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31   & NLPT).**   -1
66e0: 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77  :  We don't know
66f0: 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73   yet..**.** On s
6700: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20  ome systems, we 
6710: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
6720: 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20  time if threads 
6730: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
6740: 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b  h.** others lock
6750: 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73  s.  On those sys
6760: 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45  tems, the SQLITE
6770: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
6780: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77  _LOCK macro.** w
6790: 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f  ill be set appro
67a0: 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74  priately.  On ot
67b0: 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20  her systems, we 
67c0: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74  have to check at
67d0: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e  .** runtime.  On
67e0: 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79   these latter sy
67f0: 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48  stems, SQLTIE_TH
6800: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
6810: 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e  CK is.** undefin
6820: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
6830: 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79  ariable normally
6840: 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20   has file scope 
6850: 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e  only.  But durin
6860: 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61  g testing, we ma
6870: 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61  ke.** it a globa
6880: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65  l so that the te
6890: 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e  st code can chan
68a0: 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20  ge its value in 
68b0: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a  order to verify.
68c0: 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ** that the righ
68d0: 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20  t stuff happens 
68e0: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
68f0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
6900: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
6910: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
6920: 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f    ifndef SQLITE_
6930: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6940: 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e 65  LOCK.#    define
6950: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6960: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
6970: 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65  #  endif.#  ifde
6980: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
6990: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
69a0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
69b0: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
69c0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
69d0: 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 69  #  else.static i
69e0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
69f0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6a00: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
6a10: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
6a20: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
6a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
6a40: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
6a50: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
6a60: 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  into individual 
6a70: 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  test.** threads 
6a80: 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61  by the testThrea
6a90: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
6aa0: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
6ab0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
6ac0: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b  Data {.  int fd;
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f  /* File to be lo
6af0: 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  cked */.  struct
6b00: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
6b10: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
6b20: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
6b30: 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20  nt result;      
6b40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
6b50: 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  of the locking o
6b60: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  peration */.};..
6b70: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
6b80: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
6b90: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a  (__linux__)./*.*
6ba0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6bb0: 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 6d  is used as the m
6bc0: 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
6bd0: 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68 65  a thread launche
6be0: 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72 65  d by.** testThre
6bf0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6c00: 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77 68  r(). It tests wh
6c10: 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65 64  ether the shared
6c20: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a  -lock obtained.*
6c30: 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74 68  * by the main th
6c40: 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72 65  read in testThre
6c50: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6c60: 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  r() conflicts wi
6c70: 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74  th a.** hypothet
6c80: 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ical write-lock 
6c90: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
6ca0: 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20 73   thread on the s
6cb0: 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ame file..**.** 
6cc0: 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  The write-lock i
6cd0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
6ce0: 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69 73  cquired, as this
6cf0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
6d00: 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65   if .** the file
6d10: 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61 64   is open in read
6d20: 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65 20  -only mode (see 
6d30: 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a  ticket #3472)..*
6d40: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  / .static void *
6d50: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
6d60: 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  t(void *pArg){. 
6d70: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
6d80: 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  stData *pData = 
6d90: 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  (struct threadTe
6da0: 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  stData*)pArg;.  
6db0: 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20  pData->result = 
6dc0: 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c  fcntl(pData->fd,
6dd0: 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74 61   F_GETLK, &pData
6de0: 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72  ->lock);.  retur
6df0: 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  n pArg;.}.#endif
6e00: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41   /* SQLITE_THREA
6e10: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
6e20: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a  (__linux__) */..
6e30: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
6e40: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
6e50: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
6e60: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
6e70: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
6e80: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
6e90: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
6ea0: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
6eb0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6ec0: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
6ed0: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
6ee0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6ef0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
6f00: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
6f10: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
6f20: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
6f30: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
6f40: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74  .  int fd;.  int
6f50: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68   rc;.  struct th
6f60: 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a  readTestData d;.
6f70: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
6f80: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b  ;.  pthread_t t;
6f90: 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f  ..  fd = dup(fd_
6fa0: 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c  orig);.  if( fd<
6fb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
6fc0: 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65  mset(&l, 0, size
6fd0: 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79  of(l));.  l.l_ty
6fe0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
6ff0: 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  l.l_len = 1;.  l
7000: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
7010: 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  l.l_whence = SEE
7020: 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63  K_SET;.  rc = fc
7030: 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53  ntl(fd_orig, F_S
7040: 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28  ETLK, &l);.  if(
7050: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b   rc!=0 ) return;
7060: 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c  .  memset(&d, 0,
7070: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
7080: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f  .fd = fd;.  d.lo
7090: 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b  ck = l;.  d.lock
70a0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
70b0: 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  K;.  pthread_cre
70c0: 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61  ate(&t, 0, threa
70d0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
70e0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69  );.  pthread_joi
70f0: 6e 28 74 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65  n(t, 0);.  close
7100: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
7110: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
7120: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
7130: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7140: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
7150: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7160: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7170: 45 5f 54 48 45 52 41 44 53 41 46 45 20 26 26 20  E_THERADSAFE && 
7180: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7190: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
71a0: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
71b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
71c0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
71d0: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
71e0: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
71f0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
7200: 49 6e 66 6f 28 73 74 72 75 63 74 20 75 6e 69 78  Info(struct unix
7210: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29  LockInfo *pLock)
7220: 7b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b  {.  if( pLock ){
7230: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66  .    pLock->nRef
7240: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  --;.    if( pLoc
7250: 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  k->nRef==0 ){.  
7260: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
7270: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
7280: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70  assert( pLock->p
7290: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f  Prev->pNext==pLo
72a0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ck );.        pL
72b0: 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ock->pPrev->pNex
72c0: 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  t = pLock->pNext
72d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
72e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
72f0: 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29  ockList==pLock )
7300: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69  ;.        lockLi
7310: 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  st = pLock->pNex
7320: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
7330: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78   if( pLock->pNex
7340: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
7350: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ert( pLock->pNex
7360: 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20  t->pPrev==pLock 
7370: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  );.        pLock
7380: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
7390: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20   pLock->pPrev;. 
73a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
73b0: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29  ite3_free(pLock)
73c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
73d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
73e0: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
73f0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
7400: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
7410: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
7420: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7430: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
7440: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
7450: 4f 70 65 6e 29 7b 0a 20 20 69 66 28 20 70 4f 70  Open){.  if( pOp
7460: 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d  en ){.    pOpen-
7470: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7480: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
7490: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
74a0: 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  en->pPrev ){.   
74b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
74c0: 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  en->pPrev->pNext
74d0: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
74e0: 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d     pOpen->pPrev-
74f0: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
7500: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
7510: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7520: 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f  rt( openList==pO
7530: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  pen );.        o
7540: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d  penList = pOpen-
7550: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
7560: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
7570: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
7580: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
7590: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
75a0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
75b0: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50  pOpen->pNext->pP
75c0: 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72  rev = pOpen->pPr
75d0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
75e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
75f0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
7600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7610: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
7620: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
7630: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
7640: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 75  riptor, locate u
7650: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  nixLockInfo and 
7660: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7670: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
7680: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
7690: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
76a0: 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20  Create new ones 
76b0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
76c0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
76d0: 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69  ues might be uni
76e0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
76f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
7700: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
7710: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
7720: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
7730: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
7740: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
7750: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
7760: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
7770: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
7780: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
7790: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
77a0: 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  LockInfo **ppLoc
77b0: 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  k,  /* Return th
77c0: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
77d0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
77e0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
77f0: 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20  enCnt **ppOpen  
7800: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7810: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7820: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b  cture here */.){
7830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
7860: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
7870: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
78a0: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
78b0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
78c0: 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65  ixLockKey lockKe
78d0: 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20  y;    /* Lookup 
78e0: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
78f0: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
7900: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  re */.  struct u
7910: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
7920: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
7930: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
7940: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20  xOpenCnt struct 
7950: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
7960: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
7970: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
7980: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
7990: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  n */.  struct un
79a0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
79b0: 6b 3b 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  k;    /* Candida
79c0: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
79d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75  object */.  stru
79e0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
79f0: 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61  pOpen;     /* Ca
7a00: 6e 64 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e  ndidate unixOpen
7a10: 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  Cnt object */.. 
7a20: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
7a30: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
7a40: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
7a50: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
7a60: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
7a70: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
7a80: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
7a90: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
7aa0: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
7ab0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
7ac0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
7ad0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7ae0: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
7af0: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
7b00: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7b10: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
7b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
7b30: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
7b40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7b50: 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  RR;.  }..  /* On
7b60: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
7b70: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
7b80: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
7b90: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
7ba0: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
7bb0: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
7bc0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
7bd0: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
7be0: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
7bf0: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
7c00: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
7c10: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
7c20: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
7c30: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
7c40: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
7c50: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
7c60: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
7c70: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
7c80: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
7c90: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
7ca0: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
7cb0: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
7cc0: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
7cd0: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
7ce0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
7cf0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
7d00: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
7d10: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
7d20: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
7d30: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
7d40: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
7d50: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
7d60: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
7d70: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
7d80: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
7d90: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
7da0: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
7db0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
7dc0: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
7dd0: 0a 20 20 20 20 77 72 69 74 65 28 66 64 2c 20 22  .    write(fd, "
7de0: 53 22 2c 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  S", 1);.    rc =
7df0: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
7e00: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
7e10: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
7e20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
7e30: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
7e40: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
7e60: 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20  emset(&lockKey, 
7e70: 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  0, sizeof(lockKe
7e80: 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  y));.  lockKey.f
7e90: 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  id.dev = statbuf
7ea0: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
7eb0: 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65  VXWORKS.  lockKe
7ec0: 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c  y.fid.pId = pFil
7ed0: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
7ee0: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20  lockKey.fid.ino 
7ef0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
7f00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
7f10: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
7f20: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
7f30: 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61  x__).  if( threa
7f40: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
7f50: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
7f60: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
7f70: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
7f80: 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ;.  }.  lockKey.
7f90: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
7fa0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
7fb0: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
7fc0: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
7fd0: 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63  f.  fileId = loc
7fe0: 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20  kKey.fid;.  if( 
7ff0: 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20  ppLock!=0 ){.   
8000: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
8010: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c  t;.    while( pL
8020: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c  ock && memcmp(&l
8030: 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e  ockKey, &pLock->
8040: 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28  lockKey, sizeof(
8050: 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20  lockKey)) ){.   
8060: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b     pLock = pLock
8070: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
8080: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8090: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
80a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
80b0: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
80c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
80d0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
80e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
80f0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8100: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
8110: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
8120: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79    pLock->lockKey
8130: 20 3d 20 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20 20   = lockKey;.    
8140: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20    pLock->nRef = 
8150: 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  1;.      pLock->
8160: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
8170: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8180: 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   0;.      pLock-
8190: 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73  >pNext = lockLis
81a0: 74 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  t;.      pLock->
81b0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
81c0: 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20   if( lockList ) 
81d0: 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20  lockList->pPrev 
81e0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c  = pLock;.      l
81f0: 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b  ockList = pLock;
8200: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8210: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b    pLock->nRef++;
8220: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f  .    }.    *ppLo
8230: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
8240: 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20    if( ppOpen!=0 
8250: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f  ){.    pOpen = o
8260: 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  penList;.    whi
8270: 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d  le( pOpen && mem
8280: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f  cmp(&fileId, &pO
8290: 70 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  pen->fileId, siz
82a0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
82b0: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f        pOpen = pO
82c0: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
82d0: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  }.    if( pOpen=
82e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65  =0 ){.      pOpe
82f0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  n = sqlite3_mall
8300: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65  oc( sizeof(*pOpe
8310: 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n) );.      if( 
8320: 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pOpen==0 ){.    
8330: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
8340: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
8350: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8360: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
8370: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
8380: 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  kinfo;.      }. 
8390: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65       pOpen->file
83a0: 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20  Id = fileId;.   
83b0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d     pOpen->nRef =
83c0: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   1;.      pOpen-
83d0: 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  >nLock = 0;.    
83e0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
83f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
8400: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
8410: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70  ;.      pOpen->p
8420: 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b  Next = openList;
8430: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50  .      pOpen->pP
8440: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rev = 0;.      i
8450: 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f 70  f( openList ) op
8460: 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  enList->pPrev = 
8470: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70 65  pOpen;.      ope
8480: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a 23  nList = pOpen;.#
8490: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
84a0: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 53 65 6d 20      pOpen->pSem 
84b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4f  = NULL;.      pO
84c0: 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  pen->aSemName[0]
84d0: 20 3d 20 27 5c 30 27 3b 0a 23 65 6e 64 69 66 0a   = '\0';.#endif.
84e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84f0: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a   pOpen->nRef++;.
8500: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65      }.    *ppOpe
8510: 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a  n = pOpen;.  }..
8520: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
8530: 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  o:.  return rc;.
8540: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
8550: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
8560: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
8570: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
8580: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
8590: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
85a0: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
85b0: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
85c0: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
85d0: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
85e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
85f0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
8600: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
8610: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
8620: 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75  n systems that u
8630: 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  se LinuxThreads.
8640: 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70  .**.** Ownership
8650: 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c   transfer is onl
8660: 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  y allowed if the
8670: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72   unixFile is cur
8680: 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  rently unlocked.
8690: 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46  .** If the unixF
86a0: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e  ile is locked an
86b0: 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69  d an ownership i
86c0: 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65  s wrong, then re
86d0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  turn.** SQLITE_M
86e0: 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f  ISUSE.  SQLITE_O
86f0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
8700: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
8710: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
8720: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
8730: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
8740: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  ).static int tra
8750: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75  nsferOwnership(u
8760: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
8770: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
8780: 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20  read_t hSelf;.  
8790: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
87a0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
87b0: 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e  ks ){.    /* Own
87c0: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73  ership transfers
87d0: 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74   not needed on t
87e0: 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  his system */.  
87f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8800: 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20  OK;.  }.  hSelf 
8810: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
8820: 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f  ;.  if( pthread_
8830: 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64  equal(pFile->tid
8840: 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20  , hSelf) ){.    
8850: 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20  /* We are still 
8860: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  in the same thre
8870: 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ad */.    OSTRAC
8880: 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c  E1("No-transfer,
8890: 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29   same thread\n")
88a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
88b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
88c0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
88d0: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
88e0: 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63    /* We cannot c
88f0: 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20  hange ownership 
8900: 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c  while we are hol
8910: 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a  ding a lock! */.
8920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8930: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
8940: 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66  OSTRACE4("Transf
8950: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
8960: 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  %d from %d to %d
8970: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
8980: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
8990: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20  ->tid, hSelf);. 
89a0: 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53   pFile->tid = hS
89b0: 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65  elf;.  if (pFile
89c0: 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29  ->pLock != NULL)
89d0: 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   {.    releaseLo
89e0: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
89f0: 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ock);.    rc = f
8a00: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  indLockInfo(pFil
8a10: 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  e, &pFile->pLock
8a20: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
8a30: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
8a40: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
8a50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
8a60: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
8a70: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
8a80: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
8a90: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
8aa0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
8ab0: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
8ac0: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
8ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
8ae0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8af0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8b00: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20  .}.#else  /* if 
8b10: 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41  not SQLITE_THREA
8b20: 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e  DSAFE */.  /* On
8b30: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
8b40: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
8b50: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
8b60: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
8b70: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
8b80: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
8b90: 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  K.#endif /* SQLI
8ba0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f  TE_THREADSAFE */
8bb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
8bc0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
8bd0: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
8be0: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
8bf0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
8c00: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
8c10: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
8c20: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
8c30: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
8c40: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
8c50: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
8c60: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
8c70: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
8c80: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
8c90: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
8ca0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
8cb0: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
8cc0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
8cd0: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
8ce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8cf0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
8d00: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
8d10: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
8d20: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8d30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
8d40: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
8d50: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
8d60: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
8d70: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
8d80: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
8d90: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
8da0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
8db0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
8dc0: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
8dd0: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
8de0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
8df0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
8e00: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
8e10: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
8e20: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
8e30: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
8e40: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
8e50: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
8e60: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
8e70: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
8e80: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
8e90: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
8ea0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8eb0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
8ec0: 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
8ed0: 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  d ){.    struct 
8ee0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
8ef0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
8f00: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
8f10: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
8f20: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
8f30: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
8f40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
8f50: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
8f60: 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70  f (-1 == fcntl(p
8f70: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
8f80: 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20  , &lock)) {.    
8f90: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
8fa0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
8fb0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
8fc0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
8fd0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
8fe0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
8ff0: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
9000: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
9010: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
9020: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
9030: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
9040: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
9050: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
9060: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
9070: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
9080: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
9090: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
90a0: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
90b0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
90c0: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
90d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
90e0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
90f0: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
9100: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
9110: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
9120: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
9130: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
9140: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
9150: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
9160: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
9170: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
9180: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
9190: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
91a0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
91b0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
91c0: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
91d0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
91e0: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
91f0: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
9200: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
9210: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
9220: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
9230: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
9240: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
9250: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
9260: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
9270: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
9280: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
9290: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
92a0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
92b0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
92c0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
92d0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
92e0: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
92f0: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
9300: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
9310: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
9320: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
9330: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
9340: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
9350: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
9360: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
9370: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
9380: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
9390: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
93a0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
93b0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
93c0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
93d0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
93e0: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
93f0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
9400: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
9410: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9420: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
9430: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
9440: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
9450: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9460: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
9470: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
9480: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
9490: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
94a0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
94b0: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
94c0: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
94d0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
94e0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
94f0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
9500: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
9510: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
9520: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
9530: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
9540: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
9550: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
9560: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
9570: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
9580: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
9590: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
95a0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
95b0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
95c0: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
95d0: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
95e0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
95f0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
9600: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
9610: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9620: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
9630: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
9640: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
9650: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
9660: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
9670: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9680: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
9690: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
96a0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
96b0: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
96c0: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
96d0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
96e0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
96f0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
9700: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
9710: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
9720: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
9730: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
9740: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9750: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
9760: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
9770: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
9780: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
9790: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
97a0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
97b0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
97c0: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
97d0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
97e0: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
97f0: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
9800: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
9810: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
9820: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
9830: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
9840: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
9850: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
9860: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
9870: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
9880: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
9890: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
98a0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
98b0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
98c0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
98d0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
98e0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
98f0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
9900: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
9910: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
9920: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
9930: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
9940: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
9950: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
9960: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
9970: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
9980: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
9990: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
99a0: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
99b0: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
99c0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
99d0: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
99e0: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
99f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
9a00: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
9a10: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
9a20: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
9a30: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
9a40: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9a50: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
9a60: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
9a70: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
9a80: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
9a90: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
9aa0: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
9ab0: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
9ac0: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
9ad0: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
9ae0: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
9af0: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
9b00: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
9b10: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
9b20: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
9b30: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
9b40: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
9b50: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
9b60: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
9b70: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9b80: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9b90: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
9ba0: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
9bb0: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
9bc0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
9bd0: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
9be0: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
9bf0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
9c00: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
9c10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
9c20: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
9c30: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
9c40: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
9c50: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
9c60: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
9c70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9c80: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
9c90: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
9ca0: 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75  *)id;.  struct u
9cb0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
9cc0: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
9cd0: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
9ce0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
9cf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
9d00: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
9d10: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
9d20: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
9d30: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
9d40: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
9d50: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
9d60: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
9d70: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
9d80: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
9d90: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
9da0: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
9db0: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
9dc0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
9dd0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
9de0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
9df0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
9e00: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
9e10: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
9e20: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
9e30: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
9e40: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
9e50: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
9e60: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
9e70: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
9e80: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
9e90: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
9ea0: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
9eb0: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
9ec0: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
9ed0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
9ee0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9ef0: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
9f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f10: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
9f20: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
9f30: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
9f40: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
9f50: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
9f60: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
9f70: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
9f80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9f90: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
9fa0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
9fb0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
9fc0: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
9fd0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
9fe0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9ff0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
a000: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
a010: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
a020: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
a030: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
a040: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
a050: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
a060: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
a070: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
a080: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
a090: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
a0a0: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
a0b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a0c0: 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
a0d0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
a0e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a0f0: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
a100: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
a110: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
a120: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
a130: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
a140: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
a150: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
a160: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
a170: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
a180: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
a190: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c  .  if( (pFile->l
a1a0: 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e  ocktype!=pLock->
a1b0: 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20  locktype && .   
a1c0: 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c         (pLock->l
a1d0: 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  ocktype>=PENDING
a1e0: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
a1f0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  e>SHARED_LOCK)).
a200: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a210: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
a220: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a230: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
a240: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
a250: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
a260: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
a270: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
a280: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
a290: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
a2a0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
a2b0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
a2c0: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
a2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
a2e0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
a2f0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
a300: 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e   .      (pLock->
a310: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a320: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
a330: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
a340: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
a350: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a360: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
a370: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
a380: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  le->locktype==0 
a390: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a3a0: 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20  Lock->cnt>0 );. 
a3b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a3c0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a3d0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ;.    pLock->cnt
a3e0: 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  ++;.    pFile->p
a3f0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a400: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a410: 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  ;.  }..  lock.l_
a420: 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63  len = 1L;..  loc
a430: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a440: 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50  K_SET;..  /* A P
a450: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
a460: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
a470: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
a480: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
a490: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
a4a0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
a4b0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
a4c0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
a4d0: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
a4e0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
a4f0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
a500: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
a510: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
a520: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a530: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
a540: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
a550: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
a560: 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70  _type = (locktyp
a570: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  e==SHARED_LOCK?F
a580: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
a590: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a5a0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
a5b0: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
a5c0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
a5d0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
a5e0: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
a5f0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
a600: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
a610: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a620: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a630: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a640: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
a650: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
a660: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
a670: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a680: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
a690: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
a6a0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
a6b0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
a6c0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
a6d0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
a6e0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
a6f0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
a700: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
a710: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
a720: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
a730: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
a740: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
a750: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
a760: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
a770: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
a780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
a790: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
a7a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
a7b0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
a7c0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
a7d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
a7e0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
a7f0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
a800: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
a810: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a820: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
a830: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a840: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a850: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
a860: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
a870: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
a880: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
a890: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
a8a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
a8b0: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
a8c0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
a8d0: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
a8e0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a8f0: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
a900: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
a910: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
a920: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
a930: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
a940: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
a950: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
a960: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
a970: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
a980: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
a990: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
a9a0: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
a9b0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
a9c0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
a9d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a9e0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
a9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aa00: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
aa10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa20: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
aa30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aa40: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
aa50: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
aa60: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
aa70: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
aa80: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
aa90: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aaa0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aab0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
aac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
aad0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
aae0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
aaf0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
ab00: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
ab10: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
ab20: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ab30: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
ab40: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
ab50: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
ab60: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
ab70: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
ab80: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
ab90: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
aba0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
abb0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
abc0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
abd0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
abe0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
abf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
ac00: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
ac10: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
ac20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
ac30: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
ac40: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
ac50: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
ac60: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
ac70: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
ac80: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
ac90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
aca0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
acb0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
acc0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
acd0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
ace0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
acf0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
ad00: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
ad10: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
ad20: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
ad30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad40: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
ad50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
ad60: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ad70: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
ad80: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ad90: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
ada0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
adb0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
adc0: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
add0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
ade0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
adf0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
ae00: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ae10: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
ae20: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
ae30: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
ae40: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ae50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
ae60: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
ae70: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
ae80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
ae90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
aea0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
aeb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
aec0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aed0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
aee0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
aef0: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  e;.    pLock->lo
af00: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
af10: 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  e;.  }else if( l
af20: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
af30: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
af40: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
af50: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
af60: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
af70: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
af80: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
af90: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
afa0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
afb0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
afc0: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
afd0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
afe0: 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
aff0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
b000: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
b010: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b020: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
b030: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
b040: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
b050: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
b060: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
b070: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
b080: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
b090: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
b0a0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
b0b0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
b0c0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
b0d0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
b0e0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
b0f0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
b100: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
b110: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
b120: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
b130: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
b140: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
b150: 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20 75  ype){.  struct u
b160: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
b170: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
b180: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
b190: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b1a0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b1b0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b1c0: 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73  ;.  int h;..  as
b1d0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
b1e0: 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43   OSTRACE7("UNLOC
b1f0: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
b200: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22  %d,%d) pid=%d\n"
b210: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
b220: 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c  type,.      pFil
b230: 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
b240: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
b250: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ype, pFile->pLoc
b260: 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29  k->cnt, getpid()
b270: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  );..  assert( lo
b280: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
b290: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
b2a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f  le->locktype<=lo
b2b0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
b2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b2d0: 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f    }.  if( CHECK_
b2e0: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20  THREADID(pFile) 
b2f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b300: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
b310: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
b320: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
b330: 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  ->h;.  pLock = p
b340: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
b350: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
b360: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
b370: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
b380: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b390: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b3a0: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
b3b0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
b3c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b3d0: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
b3e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
b3f0: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
b400: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
b410: 67 6e 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  gn(0);.    if( l
b420: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b430: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
b440: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
b450: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
b460: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b470: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
b480: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b490: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
b4a0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b4b0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66  D_SIZE;.      if
b4c0: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
b4d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
b4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b4f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b500: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b510: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b520: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b540: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
b550: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
b560: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
b570: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
b580: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
b590: 20 20 20 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e     }.....goto en
b5a0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
b5b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
b5c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
b5d0: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
b5e0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b5f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
b600: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
b610: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
b620: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
b630: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
b640: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
b650: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68  .    if( fcntl(h
b660: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b670: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
b680: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
b690: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
b6a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b6b0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
b6c0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
b6d0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b6e0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b6f0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
b700: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  NLOCK);.      if
b710: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
b720: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
b730: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
b740: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
b750: 7d 0a 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e  }....goto end_un
b760: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
b770: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
b780: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
b790: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
b7a0: 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f  t *pOpen;..    /
b7b0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
b7c0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
b7d0: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
b7e0: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
b7f0: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
b800: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
b810: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
b820: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
b830: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
b840: 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
b850: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d      pLock->cnt--
b860: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
b870: 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >cnt==0 ){.     
b880: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b890: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
b8a0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b8b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
b8c0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
b8d0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
b8e0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
b8f0: 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
b900: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
b910: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
b920: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
b930: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
b940: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
b950: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
b960: 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  !=(-1) ){.      
b970: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
b980: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  e = NO_LOCK;.   
b990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b9a0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
b9b0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
b9c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
b9d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
b9e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
b9f0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
ba00: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ba10: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
ba20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ba30: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ba40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ba50: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
ba60: 31 3b 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f  1;.....goto end_
ba70: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  unlock;.      }.
ba80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
ba90: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
baa0: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
bab0: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
bac0: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
bad0: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
bae0: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
baf0: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
bb00: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
bb10: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
bb20: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
bb30: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
bb40: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
bb50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bb60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  _OK ){.      pOp
bb70: 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  en = pFile->pOpe
bb80: 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  n;.      pOpen->
bb90: 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
bba0: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c  ssert( pOpen->nL
bbb0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
bbc0: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  if( pOpen->nLock
bbd0: 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50  ==0 && pOpen->nP
bbe0: 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20  ending>0 ){.    
bbf0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
bc00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
bc10: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69  pen->nPending; i
bc20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ++){.          /
bc30: 2a 20 63 6c 6f 73 65 20 70 65 6e 64 69 6e 67 20  * close pending 
bc40: 66 64 73 2c 20 62 75 74 20 69 66 20 63 6c 6f 73  fds, but if clos
bc50: 69 6e 67 20 66 61 69 6c 73 20 64 6f 6e 27 74 20  ing fails don't 
bc60: 66 72 65 65 20 74 68 65 20 61 72 72 61 79 0a 20  free the array. 
bc70: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 69           ** assi
bc80: 67 6e 20 2d 31 20 74 6f 20 74 68 65 20 73 75 63  gn -1 to the suc
bc90: 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64  cessfully closed
bca0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 6e 64   descriptors and
bcb0: 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20   record the.    
bcc0: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2e 20        ** error. 
bcd0: 20 54 68 65 20 6e 65 78 74 20 61 74 74 65 6d 70   The next attemp
bce0: 74 20 74 6f 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c  t to unlock will
bcf0: 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20   try again. */. 
bd00: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
bd10: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20  en->aPending[i] 
bd20: 3c 20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  < 0 ) continue;.
bd30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
bd40: 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ose(pOpen->aPend
bd50: 69 6e 67 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  ing[i]) ){.     
bd60: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
bd70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
bd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
bd90: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
bda0: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20  LOSE;.          
bdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bdc0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
bdd0: 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  ng[i] = -1;.    
bde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bdf0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
be00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
be10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be20: 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65  _free(pOpen->aPe
be30: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  nding);.        
be40: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
be50: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
be60: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
be70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
be80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
be90: 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
bea0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
beb0: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
bec0: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
bed0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
bee0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
bef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
bf00: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
bf10: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
bf20: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
bf30: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
bf40: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
bf50: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
bf60: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
bf70: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
bf80: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
bf90: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
bfa0: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
bfb0: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
bfc0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
bfd0: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
bfe0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
bff0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
c000: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
c010: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
c020: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
c030: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
c040: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
c050: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
c060: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
c070: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
c080: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c090: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
c0a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
c0b0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
c0c0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
c0d0: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
c0e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
c0f0: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
c100: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
c110: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
c120: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  d);.      if( er
c130: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
c140: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c150: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
c160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c170: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
c180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c190: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
c1a0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
c1b0: 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  }.    if( pFile-
c1c0: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >h>=0 ){.      i
c1d0: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
c1e0: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
c1f0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
c200: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c210: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c220: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c230: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
c240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
c250: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
c260: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
c270: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
c280: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
c290: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
c2a0: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
c2b0: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
c2c0: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
c2d0: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
c2e0: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
c2f0: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
c300: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c310: 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f     OSTRACE2("CLO
c320: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
c330: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65  ile->h);.    Ope
c340: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
c350: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
c360: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
c370: 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  le));.  }.  retu
c380: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c390: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
c3a0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
c3b0: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
c3c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
c3d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c3e0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
c3f0: 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
c400: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c410: 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78  e *)id;.    unix
c420: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
c430: 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
c440: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
c450: 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20  f( pFile->pOpen 
c460: 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d  && pFile->pOpen-
c470: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
c480: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
c490: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
c4a0: 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
c4b0: 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
c4c0: 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
c4d0: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
c4e0: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
c4f0: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
c500: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
c510: 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
c520: 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61  ptor to pOpen->a
c530: 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
c540: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
c550: 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
c560: 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
c570: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
c580: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c590: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
c5a0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
c5b0: 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46  nCnt *pOpen = pF
c5c0: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20  ile->pOpen;.    
c5d0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
c5e0: 5f 72 65 61 6c 6c 6f 63 28 70 4f 70 65 6e 2d 3e  _realloc(pOpen->
c5f0: 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e  aPending, (pOpen
c600: 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69  ->nPending+1)*si
c610: 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20  zeof(int) );.   
c620: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
c630: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
c640: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20  a malloc fails, 
c650: 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69  just leak the fi
c660: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
c670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c680: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
c690: 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20  nding = aNew;.  
c6a0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
c6b0: 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65  nding[pOpen->nPe
c6c0: 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e  nding] = pFile->
c6d0: 68 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  h;.        pOpen
c6e0: 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20  ->nPending++;.  
c6f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
c700: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
c710: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
c720: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
c730: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
c740: 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
c750: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d  pOpen);.    rc =
c760: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
c770: 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
c780: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
c790: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
c7b0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
c7c0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
c7d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
c7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c7f0: 2a 2a 2a 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 2f 0a 0a 2f  ************/../
c840: 2a 2a 2a 2a 2a 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 0a 2a  **************.*
c890: 2a 2a 2a 2a 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 20 4e 6f  ************* No
c8b0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c8e0: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
c8f0: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
c900: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
c910: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
c920: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
c930: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
c940: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
c950: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
c960: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
c970: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
c980: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
c990: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
c9a0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
c9b0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
c9c0: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
c9d0: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
c9e0: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
c9f0: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
ca00: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
ca10: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
ca20: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
ca30: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
ca40: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
ca50: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
ca60: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
ca70: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
ca80: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
ca90: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
caa0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
cab0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
cac0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
cad0: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
cae0: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
caf0: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
cb00: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
cb10: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
cb20: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
cb30: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
cb40: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
cb50: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
cb60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
cb70: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
cb80: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
cb90: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
cba0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
cbb0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
cbc0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
cbd0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
cbe0: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
cbf0: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
cc00: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
cc10: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
cc20: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
cc30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc40: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
cc50: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
cc60: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
cc70: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
cc80: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
cc90: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
cca0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
ccb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ccc0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ccd0: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
cce0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
ccf0: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
cd00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cd10: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
cd20: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
cd30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cd40: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
cd50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
cd60: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
cd70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
cd80: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
cd90: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
cda0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
cdb0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
cdc0: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
cdd0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
cde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
cdf0: 2a 2a 2a 2a 2a 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 2f 0a  **************/.
ce40: 0a 2f 2a 2a 2a 2a 2a 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: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
ceb0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
cec0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cee0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
cef0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
cf00: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
cf10: 68 65 20 65 78 69 73 74 69 6e 67 20 6f 66 20 73  he existing of s
cf20: 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
cf30: 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74  files in order t
cf40: 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
cf50: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
cf60: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e  .  This works on
cf70: 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65   just.** about e
cf80: 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20  very filesystem 
cf90: 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74  imaginable.  But
cfa0: 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f   there are serio
cfb0: 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a  us downsides:.**
cfc0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72  .**    (1)  Ther
cfd0: 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72  e is zero concur
cfe0: 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65  rency.  A single
cff0: 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61   reader blocks a
d000: 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  ll other.**     
d010: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
d020: 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20  from reading or 
d030: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
d040: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  base..**.**    (
d050: 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69  2)  An applicati
d060: 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65  on crash or powe
d070: 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65  r loss can leave
d080: 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65   stale lock file
d090: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74  s.**         sit
d0a0: 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74  ting around that
d0b0: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
d0c0: 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a  red manually..**
d0d0: 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73  .** Nevertheless
d0e0: 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61  , a dotlock is a
d0f0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  n appropriate lo
d100: 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75  cking mode for u
d110: 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65  se if no.** othe
d120: 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  r locking strate
d130: 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  gy is available.
d140: 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c  .**.** Dotfile l
d150: 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20  ocking works by 
d160: 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
d170: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
d180: 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20  ctory as the.** 
d190: 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
d1a0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
d1b0: 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
d1c0: 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
d1d0: 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
d1e0: 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66  ance of a lock f
d1f0: 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ile implies an E
d200: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
d210: 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a  All other lock.*
d220: 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  * types (SHARED,
d230: 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
d240: 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
d250: 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
d260: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
d270: 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
d280: 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
d290: 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
d2a0: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
d2b0: 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  ** lock file..*/
d2c0: 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
d2d0: 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
d2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d2f0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
d300: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
d310: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
d320: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
d330: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
d340: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
d350: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
d360: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
d370: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
d380: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
d390: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
d3a0: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
d3b0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
d3c0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
d3d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
d3e0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
d3f0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
d400: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
d410: 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
d420: 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
d430: 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
d440: 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
d450: 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
d460: 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
d470: 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
d480: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
d490: 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
d4a0: 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
d4b0: 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
d4c0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
d4d0: 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
d4e0: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
d4f0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
d500: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
d510: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
d520: 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
d530: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
d540: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
d550: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d560: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d570: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
d580: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
d590: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
d5a0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
d5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d5c0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
d5d0: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
d5e0: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
d5f0: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
d600: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
d610: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
d620: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
d630: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
d640: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
d650: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
d660: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
d670: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
d680: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
d690: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
d6a0: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
d6b0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
d6c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
d6d0: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
d6e0: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
d6f0: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
d700: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
d710: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
d720: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
d730: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
d740: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
d750: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
d760: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
d770: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
d780: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
d790: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
d7a0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
d7b0: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
d7c0: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
d7d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d7e0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
d7f0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
d800: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
d810: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
d820: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
d830: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
d840: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
d850: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
d860: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
d870: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
d880: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
d890: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
d8a0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
d8b0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
d8c0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
d8d0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
d8e0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
d8f0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
d900: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
d910: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
d920: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
d930: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
d940: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
d950: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
d960: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
d970: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
d980: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
d990: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
d9a0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
d9b0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
d9c0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
d9d0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
d9e0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
d9f0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
da00: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
da10: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
da20: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
da30: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
da40: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
da50: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
da60: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
da70: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
da80: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
da90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
daa0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
dab0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
dac0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
dad0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
dae0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
daf0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
db00: 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
db10: 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
db20: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
db30: 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
db40: 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
db50: 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
db60: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
db70: 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
db80: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
db90: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
dba0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
dbb0: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
dbc0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
dbd0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
dbe0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
dbf0: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
dc00: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
dc10: 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
dc20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
dc30: 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
dc40: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
dc50: 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
dc60: 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
dc70: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
dc80: 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
dc90: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
dca0: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
dcb0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
dcc0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20  ile->locktype > 
dcd0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
dce0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
dcf0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 23 69 66 20 21   locktype;.#if !
dd00: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
dd10: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
dd20: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
dd30: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
dd40: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
dd50: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
dd60: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
dd70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
dd80: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
dd90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
dda0: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
ddb0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
ddc0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
ddd0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
dde0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
ddf0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
de00: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
de10: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
de20: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
de30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
de40: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
de50: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
de60: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
de70: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
de80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
de90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dea0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
deb0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dec0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
ded0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
dee0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
def0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
df00: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
df10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
df20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
df30: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
df40: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
df50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
df60: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
df70: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
df80: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
df90: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
dfa0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
dfb0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  /.  pFile->lockt
dfc0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
dfd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dfe0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
dff0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
e000: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e010: 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
e020: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
e030: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e040: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
e050: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
e060: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e070: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
e080: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
e090: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
e0a0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
e0b0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
e0c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e0d0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
e0e0: 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
e0f0: 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
e100: 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
e110: 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
e120: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
e130: 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
e140: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e150: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
e160: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e170: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e180: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
e190: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
e1a0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
e1b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e1c0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
e1d0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e1e0: 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22  was %d pid=%d\n"
e1f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
e200: 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d  type,..   pFile-
e210: 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
e220: 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
e230: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
e240: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
e250: 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
e260: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
e270: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
e280: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
e290: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e2a0: 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e   }..  /* To down
e2b0: 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c  grade to shared,
e2c0: 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f   simply update o
e2d0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69  ur internal noti
e2e0: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
e2f0: 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e  ock state.  No n
e300: 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68  eed to mess with
e310: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
e320: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
e330: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
e340: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
e350: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
e360: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
e370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e380: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
e390: 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
e3a0: 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
e3b0: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
e3c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  /.  assert( lock
e3d0: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
e3e0: 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c  .  if( unlink(zL
e3f0: 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
e400: 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
e410: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
e420: 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f  ENOENT != tErrno
e430: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e440: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e450: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e460: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e470: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LOCK);.    }.   
e480: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
e490: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
e4a0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e4b0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
e4c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
e4d0: 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
e4e0: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
e4f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e500: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e510: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61  lose a file.  Ma
e520: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
e530: 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73   has been releas
e540: 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  ed before closin
e550: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
e560: 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71   dotlockClose(sq
e570: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
e580: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
e590: 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
e5a0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e5b0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
e5c0: 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69   dotlockUnlock(i
e5d0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
e5e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
e5f0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
e600: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ext);.  }.  rc =
e610: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e620: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
e630: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
e640: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
e650: 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20  e dot-file lock 
e660: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
e670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e680: 2a 2a 0a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
e740: 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69  egin flock Locki
e750: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e770: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ***.**.** Use th
e780: 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d  e flock() system
e790: 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65   call to do file
e7a0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   locking..**.** 
e7b0: 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
e7c0: 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65  is like dot-file
e7d0: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74   locking in that
e7e0: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
e7f0: 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69  fine-grain locki
e800: 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72  ng levels suppor
e810: 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72  ted by SQLite ar
e820: 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f  e collapsed into
e830: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63  .** a single exc
e840: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e  lusive lock.  In
e850: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48   other words, SH
e860: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
e870: 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c  and.** PENDING l
e880: 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d  ocks are the sam
e890: 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58  e thing as an EX
e8a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53  CLUSIVE lock.  S
e8b0: 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77  QLite.** still w
e8c0: 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f  orks when you do
e8d0: 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75   this, but concu
e8e0: 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65  rrency is reduce
e8f0: 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20  d since.** only 
e900: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
e910: 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
e920: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
e930: 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d  a time..**.** Om
e940: 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  it this section 
e950: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
e960: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69  _LOCKING_STYLE i
e970: 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  s turned off or 
e980: 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20  if.** compiling 
e990: 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a  for VXWORKS..*/.
e9a0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
e9b0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
e9c0: 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  && !OS_VXWORKS..
e9d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e9e0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
e9f0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
ea00: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
ea10: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
ea20: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
ea30: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
ea40: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
ea50: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
ea60: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
ea70: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
ea80: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
ea90: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
eaa0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
eab0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
eac0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
ead0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
eae0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
eaf0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
eb00: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
eb10: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
eb20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
eb30: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
eb40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
eb50: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
eb60: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
eb70: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
eb80: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
eb90: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
eba0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
ebb0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ebc0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
ebd0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ebe0: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
ebf0: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
ec00: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
ec10: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
ec20: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
ec30: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
ec40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
ec50: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
ec60: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
ec70: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
ec80: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
ec90: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
eca0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
ecb0: 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
ecc0: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
ecd0: 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28  int lrc = flock(
ece0: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
ecf0: 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
ed00: 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
ed10: 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
ed20: 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
ed30: 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66 6c  /.      lrc = fl
ed40: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
ed50: 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66  CK_UN);.      if
ed60: 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20   ( lrc ) {.     
ed70: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
ed80: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f  errno;.        /
ed90: 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20  * unlock failed 
eda0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f  with an error */
edb0: 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73  .        lrc = s
edc0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
edd0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ede0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
edf0: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
ee00: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ee10: 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
ee20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ee30: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ee40: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72           rc = lr
ee50: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
ee60: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
ee70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
ee80: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ee90: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
eea0: 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
eeb0: 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
eec0: 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
eed0: 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
eee0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
eef0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ef00: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
ef10: 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
ef20: 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
ef40: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ef50: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
ef60: 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
ef70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
ef80: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
ef90: 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  CK %d %d %d\n", 
efa0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
efb0: 73 65 72 76 65 64 29 3b 0a 0a 23 69 66 64 65 66  served);..#ifdef
efc0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
efd0: 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
efe0: 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
eff0: 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
f000: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
f010: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
f020: 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
f030: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
f040: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
f050: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
f060: 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
f070: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
f080: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f090: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
f0a0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
f0b0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
f0c0: 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
f0d0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
f0e0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
f0f0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
f100: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
f110: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
f120: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
f130: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
f140: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
f150: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
f160: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
f170: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
f180: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
f190: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
f1a0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
f1b0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f1c0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f1d0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f1e0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f1f0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f200: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f210: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f220: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f230: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f240: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f250: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f260: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f270: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f280: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f290: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f2a0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f2b0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f2c0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f2d0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f2e0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f2f0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f300: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f310: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f320: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f330: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f340: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
f350: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
f360: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
f370: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
f380: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
f390: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
f3a0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
f3b0: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
f3c0: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
f3d0: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
f3e0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
f3f0: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
f400: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
f410: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
f420: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
f430: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f440: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
f450: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
f460: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f470: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
f480: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
f490: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
f4a0: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
f4b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f4c0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
f4d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f4e0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
f4f0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f500: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
f510: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
f520: 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
f530: 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
f540: 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
f550: 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
f560: 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
f570: 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
f580: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
f590: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
f5a0: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
f5b0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
f5c0: 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
f5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
f5e0: 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
f5f0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
f600: 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66 6c 6f 63  */.  .  if (floc
f610: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
f620: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
f630: 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
f640: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
f650: 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
f660: 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
f670: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f680: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f690: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f6a0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
f6b0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f6c0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
f6d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f6e0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
f6f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
f700: 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
f710: 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
f720: 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
f730: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
f740: 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53  cktype;.  }.  OS
f750: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
f760: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
f770: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
f780: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
f790: 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
f7a0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
f7b0: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23 69 66  : "failed");.#if
f7c0: 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
f7d0: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
f7e0: 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
f7f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
f800: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
f810: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f820: 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
f830: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
f840: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
f850: 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
f860: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
f870: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
f880: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
f890: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
f8a0: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
f8b0: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
f8c0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
f8d0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
f8e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
f8f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
f900: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f910: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
f920: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
f930: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
f940: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
f950: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f960: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
f970: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
f980: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f990: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
f9a0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f9b0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
f9c0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
f9d0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
f9e0: 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
f9f0: 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
fa00: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
fa10: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
fa20: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
fa30: 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  pe, getpid());. 
fa40: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
fa50: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
fa60: 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
fa70: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
fa80: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
fa90: 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29  type==locktype )
faa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fab0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
fac0: 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
fad0: 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
fae0: 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
faf0: 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
fb00: 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65  /.  if (locktype
fb10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
fb20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
fb30: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
fb40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fb50: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
fb60: 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
fb70: 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20  nlock. */.  int 
fb80: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
fb90: 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
fba0: 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69   if (rc) {.    i
fbb0: 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65  nt r, tErrno = e
fbc0: 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71  rrno;.    r = sq
fbd0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
fbe0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
fbf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
fc00: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
fc10: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29  _LOCK_ERROR(r) )
fc20: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
fc30: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
fc40: 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  o;.    }.#ifdef 
fc50: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
fc60: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
fc70: 20 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c      if( (r & SQL
fc80: 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
fc90: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
fca0: 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42      r = SQLITE_B
fcb0: 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  USY;.    }.#endi
fcc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
fcd0: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
fce0: 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20  RORS */.    .   
fcf0: 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65   return r;.  } e
fd00: 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
fd10: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
fd20: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
fd30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
fd40: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
fd50: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
fd60: 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
fd70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
fd80: 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
fd90: 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
fda0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
fdb0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
fdc0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
fdd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fde0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
fdf0: 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
fe00: 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
fe10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
fe20: 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
fe30: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
fe40: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
fe50: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
ff20: 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
ff50: 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
ff60: 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
ff70: 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
ff80: 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
ff90: 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
ffa0: 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
ffb0: 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
ffc0: 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
ffd0: 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
ffe0: 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
fff0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
10000 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
10010 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
10020 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
10030 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
10040 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
10050 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
10060 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
10070 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10080 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
10090 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
100a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
100b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
100c0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
100d0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
100e0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
100f0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10100 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10110 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10120 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10130 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10140 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
10150 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
10160 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10170 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10180 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10190 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
101a0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
101b0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
101c0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
101d0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
101e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
101f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10200 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
10210 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10220 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
10230 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
10240 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10250 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
10260 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10270 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
10280 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
10290 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
102a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
102b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
102c0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
102d0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
102e0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
102f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
10300 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
10310 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
10320 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
10330 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
10340 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
10350 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
10360 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
10370 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
10380 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
10390 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  Open->pSem;.    
103a0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
103b0 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
103c0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
103d0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
103e0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
103f0 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
10400 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
10410 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10420 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
10430 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
10440 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10450 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
10460 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10470 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10480 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
10490 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
104a0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
104b0 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
104c0 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
104d0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
104e0 20 3d 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   = (pFile->lockt
104f0 79 70 65 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43  ype < SHARED_LOC
10500 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
10510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
10520 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
10530 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
10540 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74  /.      sem_post
10550 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSem);.    }.  
10560 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45  }.  OSTRACE4("TE
10570 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
10580 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
10590 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
105a0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
105b0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
105c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
105d0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
105e0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
105f0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
10600 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
10610 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
10620 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
10630 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
10640 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
10650 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
10660 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
10670 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
10680 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
10690 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
106a0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
106b0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
106c0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
106d0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
106e0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
106f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
10700 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
10710 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
10720 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
10730 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
10740 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
10750 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
10760 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
10770 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
10780 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
10790 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
107a0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
107b0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
107c0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
107d0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
107e0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
107f0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
10800 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
10810 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
10820 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
10830 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
10840 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
10850 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
10860 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
10870 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
10880 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
10890 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
108a0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
108b0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
108c0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
108d0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
108e0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
108f0 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
10900 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
10910 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
10920 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
10930 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
10940 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
10950 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
10960 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
10970 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10980 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
10990 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
109a0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
109b0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
109c0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
109d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
109e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c  .static int semL
109f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10a00 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10a10 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
10a20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10a30 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
10a40 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
10a50 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
10a60 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
10a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10a80 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
10a90 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
10aa0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10ab0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10ac0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10ad0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10ae0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10af0 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
10b00 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
10b10 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
10b20 74 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53  type;.    rc = S
10b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
10b40 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
10b50 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
10b60 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
10b70 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
10b80 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
10b90 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
10ba0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
10bb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10bc0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
10bd0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
10be0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
10bf0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
10c00 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
10c10 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
10c20 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a  pe = locktype;..
10c30 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
10c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10c50 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
10c60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
10c70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10c80 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
10c90 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
10ca0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
10cb0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
10cc0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
10cd0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10ce0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
10cf0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
10d00 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
10d10 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
10d20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
10d30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10d40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10d50 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b  ic int semUnlock
10d60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10d70 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
10d80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10d90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10da0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
10db0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
10dc0 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  en->pSem;..  ass
10dd0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10de0 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
10df0 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
10e00 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
10e10 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
10e20 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
10e30 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
10e40 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
10e50 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
10e60 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
10e70 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
10e80 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
10e90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
10ea0 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
10eb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10ec0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10ed0 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
10ee0 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
10ef0 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
10f00 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
10f10 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
10f20 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
10f30 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10f40 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10f50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10f60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
10f70 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
10f80 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
10f90 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
10fa0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
10fb0 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
10fc0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
10fd0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10fe0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10ff0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11000 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
11010 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11020 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11030 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11040 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
11050 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
11060 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
11070 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
11080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11090 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
110a0 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
110b0 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71   int semClose(sq
110c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
110d0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
110e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
110f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11100 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b  d;.    semUnlock
11110 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
11120 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
11130 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
11140 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
11150 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
11160 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
11170 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
11180 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
11190 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
111a0 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
111b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
111c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
111d0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
111e0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
111f0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
11200 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
11210 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
11220 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
11240 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
11250 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
11260 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
11270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11280 2a 2a 2a 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 2f 0a 0a 0a  ************/...
112d0 2f 2a 2a 2a 2a 2a 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 0a  ***************.
11320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
11340 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11370 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
11380 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
11390 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
113a0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
113b0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
113c0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
113d0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
113e0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
113f0 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
11400 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
11410 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
11420 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
11430 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
11440 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
11450 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
11460 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20  (__DARWIN__) && 
11470 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11480 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
11490 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
114a0 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
114b0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
114c0 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
114d0 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
114e0 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
114f0 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
11500 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
11510 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
11520 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67  ontext {.  unsig
11530 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
11540 61 72 65 64 42 79 74 65 3b 0a 20 20 63 6f 6e 73  aredByte;.  cons
11550 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20  t char *dbPath; 
11560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11570 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
11580 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  file */.};..stru
11590 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
115a0 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
115b0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
115c0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
115d0 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
115e0 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
115f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
11600 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
11610 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
11620 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
11630 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
11640 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
11650 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
11660 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
11670 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
11680 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
11690 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
116a0 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
116b0 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
116c0 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
116d0 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
116e0 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
116f0 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
11700 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
11710 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11730 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
11740 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
11750 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
11760 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
11770 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
11780 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
11790 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
117a0 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20  LockPB2)../*.** 
117b0 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
117c0 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72  y for setting or
117d0 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d   clearing a bit-
117e0 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e  range lock on an
117f0 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74  .** AFP filesyst
11800 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72  em..** .** Retur
11810 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
11820 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42  uccess, SQLITE_B
11830 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  USY on failure..
11840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
11850 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73  pSetLock(.  cons
11860 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
11870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
11880 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
11890 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75  o be locked or u
118a0 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69  nlocked */.  uni
118b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
118c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
118d0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
118e0 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20  tor on path */. 
118f0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
11900 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20  ong offset,     
11910 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f  /* First byte to
11920 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
11930 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
11940 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f  ng length,     /
11950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
11960 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  s to lock */.  i
11970 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20  nt setLockFlag  
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11990 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63   True to set loc
119a0 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65  k.  False to cle
119b0 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ar lock */.){.  
119c0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
119d0 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e  LockPB2 pb;.  in
119e0 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75  t err;.  .  pb.u
119f0 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
11a00 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
11a10 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
11a20 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
11a30 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
11a40 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
11a50 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70  th; .  pb.fd = p
11a60 46 69 6c 65 2d 3e 68 3b 0a 20 20 2f 2f 53 69 6d  File->h;.  //Sim
11a70 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
11a80 67 6e 28 31 29 3b 0a 20 20 2f 2f 53 69 6d 75 6c  gn(1);.  //Simul
11a90 61 74 65 49 4f 45 72 72 6f 72 28 20 70 62 2e 66  ateIOError( pb.f
11aa0 64 3d 28 2d 31 29 20 29 0a 20 20 2f 2f 53 69 6d  d=(-1) ).  //Sim
11ab0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
11ac0 67 6e 28 30 29 3b 0a 20 20 0a 20 20 4f 53 54 52  gn(0);.  .  OSTR
11ad0 41 43 45 36 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE6("AFPSETLOCK
11ae0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
11af0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
11b00 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
11b10 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
11b20 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
11b30 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
11b40 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
11b50 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
11b60 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
11b70 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
11b80 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
11b90 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
11ba0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
11bb0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
11bc0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11bd0 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46      OSTRACE4("AF
11be0 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
11bf0 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
11c00 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
11c10 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
11c20 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
11c30 72 72 6e 6f 29 29 3b 0a 23 69 66 64 65 66 20 53  rrno));.#ifdef S
11c40 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
11c50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
11c60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
11c70 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
11c80 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11c90 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11ca0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11cb0 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
11cc0 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
11cd0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
11ce0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
11cf0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11d00 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
11d10 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
11d20 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11d30 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11d40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11d50 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11d70 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
11d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11d90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
11da0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11db0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
11dc0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
11dd0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
11de0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
11df0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
11e00 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
11e10 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
11e20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
11e30 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
11e40 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
11e50 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
11e60 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
11e70 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
11e80 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
11e90 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
11ea0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11eb0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
11ec0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11ed0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
11ee0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11ef0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
11f00 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
11f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
11f20 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
11f30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11f40 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11f50 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
11f60 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
11f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
11f80 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
11f90 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
11fa0 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63  File );.  afpLoc
11fb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
11fc0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
11fd0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
11fe0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11ff0 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  xt;.  .  /* Chec
12000 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
12010 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
12020 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
12030 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12040 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
12050 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12060 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12070 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12080 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12090 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
120a0 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
120b0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
120c0 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
120d0 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
120e0 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
120f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
12100 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
12110 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
12120 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
12130 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
12140 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
12150 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
12160 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
12170 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
12180 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
12190 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
121a0 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
121b0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
121c0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
121d0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
121e0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
121f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
12200 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
12210 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
12220 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
12230 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
12240 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
12250 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
12260 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12270 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
12280 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
12290 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45    }.  .  OSTRACE
122a0 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
122b0 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  %d %d %d\n", pFi
122c0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
122d0 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ved);.  .  *pRes
122e0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
122f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12300 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12310 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12320 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
12330 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
12340 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
12350 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
12360 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
12370 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
12380 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
12390 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
123a0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
123b0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
123c0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
123d0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
123e0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
123f0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
12400 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
12410 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
12420 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
12430 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
12440 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
12450 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12460 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
12470 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
12480 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
12490 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
124a0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
124b0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
124c0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
124d0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
124e0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
124f0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
12500 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
12510 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
12520 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
12530 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
12540 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
12550 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
12560 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12570 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
12580 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12590 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
125a0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
125b0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
125c0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
125d0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
125e0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
125f0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
12600 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
12610 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
12620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
12630 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
12640 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
12650 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
12660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
12670 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12680 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12690 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
126a0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
126b0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
126c0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
126d0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
126e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
126f0 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f  ;.  OSTRACE5("LO
12700 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
12710 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
12720 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
12730 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
12740 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70  cktype), locktyp
12750 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
12760 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64 28 29  ktype), getpid()
12770 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
12780 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
12790 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
127a0 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
127b0 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
127c0 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
127d0 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
127e0 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
127f0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
12800 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
12810 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
12820 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
12830 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12840 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
12850 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
12860 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
12870 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
12880 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
12890 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
128a0 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
128b0 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
128c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
128d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
128e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
128f0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
12900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12910 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
12920 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
12930 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
12940 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
12950 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
12960 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12970 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
12980 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
12990 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
129a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
129b0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
129c0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
129d0 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
129e0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
129f0 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
12a00 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
12a10 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
12a20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
12a30 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
12a40 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ile..  */.  rc =
12a50 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
12a60 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
12a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12a80 7b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  {.    unixLeaveM
12a90 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
12aa0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 20 20 0a  rn rc;.  }.    .
12ab0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
12ac0 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
12ad0 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
12ae0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
12af0 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
12b00 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
12b10 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
12b20 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
12b30 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
12b40 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
12b50 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
12b60 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12b70 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
12b80 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
12b90 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
12ba0 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
12bb0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
12bc0 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
12bd0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
12be0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12bf0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12c00 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
12c10 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
12c20 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
12c30 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
12c40 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
12c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
12c60 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
12c70 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
12c80 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
12c90 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
12ca0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
12cb0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
12cc0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
12cd0 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
12ce0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
12cf0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
12d00 74 20 6c 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32  t lk, lrc1, lrc2
12d10 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  , lrc1Errno;.   
12d20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74   .    /* Now get
12d30 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
12d40 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
12d50 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
12d60 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
12d70 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
12d80 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
12d90 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
12da0 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
12db0 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
12dc0 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
12dd0 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
12de0 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
12df0 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
12e00 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12e10 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
12e20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
12e30 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65  T+context->share
12e40 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
12e50 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12e60 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
12e70 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
12e80 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
12e90 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
12ea0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
12eb0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
12ec0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
12ed0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
12ee0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
12ef0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
12f00 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
12f10 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12f20 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70  rc1) ) {.      p
12f30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12f40 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  = lrc1Errno;.   
12f50 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
12f60 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
12f70 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
12f80 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
12f90 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
12fa0 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
12fb0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
12fc0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
12fd0 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
12fe0 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
12ff0 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
13000 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13010 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
13020 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
13030 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65       pFile->pOpe
13040 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
13050 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
13060 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
13070 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
13080 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
13090 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
130a0 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
130b0 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
130c0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
130d0 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
130e0 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
130f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
13100 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
13110 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
13120 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66  cktype );.    if
13130 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45   (locktype >= RE
13140 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
13150 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c  File->locktype <
13160 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
13170 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
13180 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
13190 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
131a0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
131b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
131c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
131d0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
131e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
131f0 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79  failed && lockty
13200 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f  pe == EXCLUSIVE_
13210 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK) {.      /*
13220 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
13230 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20  USIVE lock */.  
13240 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
13250 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
13260 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72  d lock before tr
13270 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20  ying the range. 
13280 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a   we'll need to .
13290 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62        ** reestab
132a0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
132b0 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74  lock if we can't
132c0 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c   get the  afpUnl
132d0 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ock.      */.   
132e0 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20     if( !(failed 
132f0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13300 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13310 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
13320 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  T +.            
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
13340 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
13350 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
13360 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
13370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13380 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
13390 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
133a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
133b0 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
133c0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
133d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
133e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
133f0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
13420 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
13430 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
13440 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
13450 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
13460 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
13490 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73  RST + context->s
134a0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
134b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
134c0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
134d0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
134e0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
134f0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
13500 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
13510 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
13520 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
13530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
13540 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
13550 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
13560 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
13570 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
13580 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
13590 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
135a0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
135b0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
135c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
135d0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
135e0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
135f0 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
13600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
13610 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
13620 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
13630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
13640 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
13650 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
13660 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
13670 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
13680 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
13690 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
136a0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
136b0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
136c0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
136d0 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
136e0 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
136f0 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
13700 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
13710 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
13720 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
13730 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
13740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13750 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13760 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13770 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
13780 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
13790 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
137a0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
137b0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
137c0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
137d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
137e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
137f0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13800 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13810 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13820 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13840 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13850 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
13860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13870 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
13880 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13890 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
138a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
138b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
138c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
138d0 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69  pCtx = (afpLocki
138e0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
138f0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
13900 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  xt;..  assert( p
13910 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
13920 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
13930 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
13940 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
13950 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
13960 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13970 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
13980 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
13990 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
139a0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
139b0 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
139c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
139d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
139e0 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
139f0 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
13a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
13a10 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69  ISUSE;.  }.  uni
13a20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13a30 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
13a40 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
13a50 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 69 66 28   ){.    .    if(
13a60 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13a70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
13a90 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  fpSetLock(pCtx->
13aa0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
13ab0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
13ac0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
13ad0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13ae0 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 74 79 70  TE_OK && locktyp
13af0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13b00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
13b10 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
13b20 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
13b30 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
13b40 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
13b50 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
13b60 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d 3e 73  ED_FIRST+pCtx->s
13b70 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20  haredByte;.     
13b80 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
13b90 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
13ba0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
13bb0 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
13bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13be0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  OK && pFile->loc
13bf0 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
13c00 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
13c10 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74  = afpSetLock(pCt
13c20 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
13c30 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
13c40 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
13c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13c60 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  _OK && pFile->lo
13c70 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
13c80 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
13c90 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70  c = afpSetLock(p
13ca0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  Ctx->dbPath, pFi
13cb0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13cc0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E, 1, 0);.    }.
13cd0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
13ce0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
13cf0 0a 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 74 68  .    /* clear th
13d00 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  e shared lock */
13d10 0a 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c  .    int sharedL
13d20 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
13d30 5f 46 49 52 53 54 2b 70 43 74 78 2d 3e 73 68 61  _FIRST+pCtx->sha
13d40 72 65 64 42 79 74 65 3b 0a 20 20 20 20 72 63 20  redByte;.    rc 
13d50 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74  = afpSetLock(pCt
13d60 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
13d70 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
13d80 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
13d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13da0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
13db0 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
13dc0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75  {.      struct u
13dd0 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
13de0 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
13df0 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
13e00 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
13e10 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  sert( pOpen->nLo
13e20 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
13e30 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
13e40 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65  =0 && pOpen->nPe
13e50 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nding>0 ){.     
13e60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
13e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70    for(i=0; i<pOp
13e80 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b  en->nPending; i+
13e90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
13ea0 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
13eb0 67 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69  g[i] < 0 ) conti
13ec0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
13ed0 66 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e  f( close(pOpen->
13ee0 61 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a  aPending[i]) ){.
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
13f00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
13f10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
13f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
13f30 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
13f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13f50 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
13f60 50 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b  Pending[i] = -1;
13f70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13fb0 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e  lite3_free(pOpen
13fc0 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20  ->aPending);.   
13fd0 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50         pOpen->nP
13fe0 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
13ff0 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
14000 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
14010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14020 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61   }.  }.  unixLea
14030 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
14040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14050 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14060 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
14070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14080 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
14090 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
140a0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
140b0 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
140c0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
140d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
140e0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
140f0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
14100 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14110 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
14120 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
14130 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
14140 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
14150 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46  ile->pOpen && pF
14160 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
14170 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
14180 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
14190 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
141a0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
141b0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
141c0 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
141d0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
141e0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
141f0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
14200 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
14210 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
14220 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  to pOpen->aPendi
14230 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
14240 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
14250 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20  osed when.      
14260 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
14270 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
14280 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
14290 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72  *aNew;.      str
142a0 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
142b0 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e  *pOpen = pFile->
142c0 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65  pOpen;.      aNe
142d0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
142e0 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  loc(pOpen->aPend
142f0 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65  ing, (pOpen->nPe
14300 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28  nding+1)*sizeof(
14310 69 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  int) );.      if
14320 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
14330 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c       /* If a mal
14340 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20  loc fails, just 
14350 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
14360 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20  scriptor */.    
14370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14380 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
14390 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
143a0 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
143b0 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  [pOpen->nPending
143c0 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  ] = pFile->h;.  
143d0 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
143e0 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20  nding++;.       
143f0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
14400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14410 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74    releaseOpenCnt
14420 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a  (pFile->pOpen);.
14430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14440 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
14450 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 63 6c 6f  ontext);.    clo
14460 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
14470 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
14480 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
14490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
144a0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
144b0 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26  ed(__DARWIN__) &
144c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
144d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
144e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
144f0 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
14500 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14510 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
14520 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
14530 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
14540 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
14550 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
14560 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
14570 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
14580 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
14590 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
145a0 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
145b0 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
145c0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
145d0 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
145f0 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
14600 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14620 2a 2a 2a 2a 2a 0a 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 2a 2a  ****************
14670 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
146d0 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
146e0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
146f0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
14720 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
14730 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
14740 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
14750 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
14760 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
14770 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
14780 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
14790 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
147a0 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
147b0 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
147c0 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
147d0 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
147e0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
147f0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
14800 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
14810 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
14820 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
14830 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
14840 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
14850 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
14860 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
14870 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
14880 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
14890 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
148a0 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
148b0 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
148c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
148d0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
148e0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
148f0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
14900 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
14910 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
14920 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
14930 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
14940 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
14950 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
14960 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
14970 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
14980 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
14990 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
149a0 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
149b0 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
149c0 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
149d0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
149e0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
149f0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
14a00 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
14a10 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
14a20 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
14a30 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
14a40 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
14a50 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
14a60 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
14a70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
14a80 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
14a90 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
14aa0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
14ab0 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
14ac0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
14ad0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36  .  int got;.  i6
14ae0 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54  4 newOffset;.  T
14af0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
14b00 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
14b10 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64  D).  got = pread
14b20 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
14b30 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
14b40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
14b50 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
14b60 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
14b70 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72  AD64).  got = pr
14b80 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ead64(id->h, pBu
14b90 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
14ba0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14bb0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
14bc0 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65  #else.  newOffse
14bd0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
14be0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
14bf0 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  T);.  SimulateIO
14c00 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
14c10 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  -- );.  if( newO
14c20 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
14c30 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
14c40 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
14c50 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
14c60 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
14c70 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
14c80 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
14c90 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
14ca0 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
14cb0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
14cc0 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28   }.  got = read(
14cd0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
14ce0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
14cf0 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
14d00 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
14d10 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
14d20 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14d30 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52 45  }.  OSTRACE5("RE
14d40 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
14d50 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
14d60 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
14d70 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
14d80 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
14d90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
14da0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
14db0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
14dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14dd0 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
14de0 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
14df0 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
14e00 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
14e10 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
14e20 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
14e30 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
14e40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
14e50 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
14e60 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
14e70 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
14e80 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  .){.  int got;. 
14e90 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
14ea0 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
14eb0 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ad((unixFile*)id
14ec0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
14ed0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
14ee0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
14ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14f00 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
14f10 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
14f20 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
14f30 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
14f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14f50 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
14f60 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
14f70 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
14f80 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
14f90 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
14fa0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
14fb0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
14fc0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
14fd0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
14fe0 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
14ff0 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
15000 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
15010 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
15020 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
15030 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
15040 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
15050 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
15060 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
15070 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
15080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15090 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
150a0 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
150b0 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
150c0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
150d0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
150e0 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
150f0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
15100 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
15110 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15130 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
15140 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
15150 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
15160 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
15170 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36  .  int got;.  i6
15180 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54  4 newOffset;.  T
15190 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
151a0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
151b0 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
151c0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
151d0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
151e0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
151f0 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
15200 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
15210 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
15220 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
15230 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
15240 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
15250 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
15260 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
15270 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
15280 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
15290 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
152a0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
152b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
152c0 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
152d0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
152e0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
152f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
15300 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
15310 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
15320 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
15330 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
15340 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
15350 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15360 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
15370 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35  .  }..  OSTRACE5
15380 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
15390 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
153a0 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
153b0 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
153c0 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
153d0 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
153e0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
153f0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
15400 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
15410 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
15420 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
15430 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
15440 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15450 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
15460 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
15470 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
15480 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
15490 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
154a0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
154b0 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  {.  int wrote = 
154c0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
154d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
154e0 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
154f0 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
15500 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75   seekAndWrite((u
15510 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66  nixFile*)id, off
15520 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
15530 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
15540 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
15550 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
15560 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
15570 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
15580 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
15590 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
155a0 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
155b0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
155c0 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
155d0 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20  amt=1 ));.  if( 
155e0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  amt>0 ){.    if(
155f0 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20   wrote<0 ){.    
15600 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
15610 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
15620 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
15630 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15640 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
15650 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
15660 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15670 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
15680 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
15690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
156a0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
156b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
156c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
156d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
156e0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
156f0 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
15700 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
15710 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
15720 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
15730 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
15740 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
15750 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
15760 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
15770 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
15780 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
15790 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
157a0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
157b0 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
157c0 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
157d0 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
157e0 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
157f0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
15800 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
15810 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
15820 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
15830 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
15840 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
15850 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
15860 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
15870 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
15880 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
15890 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
158a0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
158b0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
158c0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
158d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
158e0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
158f0 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
15900 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
15910 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
15920 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
15930 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
15940 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
15950 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
15960 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
15970 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
15980 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
15990 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
159a0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
159b0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
159c0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
159d0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
159e0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
159f0 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
15a00 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
15a10 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
15a20 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
15a30 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
15a40 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
15a50 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
15a60 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
15a70 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
15a80 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
15a90 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
15aa0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
15ab0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
15ac0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
15ad0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
15ae0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
15af0 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
15b00 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
15b10 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
15b20 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
15b30 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
15b40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
15b50 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
15b60 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
15b70 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
15b80 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
15b90 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
15ba0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
15bb0 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
15bc0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
15bd0 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
15be0 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
15bf0 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
15c00 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
15c10 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
15c20 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
15c30 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
15c40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15c50 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
15c60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
15c70 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
15c80 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
15c90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15ca0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
15cb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
15cc0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
15cd0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
15ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15cf0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
15d00 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
15d10 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
15d20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
15d30 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
15d40 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
15d50 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
15d60 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
15d70 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
15d80 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
15d90 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
15da0 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
15db0 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
15dc0 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
15dd0 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
15de0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
15df0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
15e00 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
15e10 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
15e20 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
15e30 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
15e40 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
15e50 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
15e60 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
15e70 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
15e80 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
15e90 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
15ea0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
15eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
15ec0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
15ed0 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
15ee0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  nc ){.    rc = f
15ef0 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
15f00 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
15f10 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
15f20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
15f30 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
15f40 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
15f50 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
15f60 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
15f70 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
15f80 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
15f90 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
15fa0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
15fb0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
15fc0 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
15fd0 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
15fe0 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
15ff0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
16000 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
16010 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
16020 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
16030 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
16040 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
16050 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
16060 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
16070 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
16080 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
16090 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
160a0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
160b0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
160c0 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
160d0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
160e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
160f0 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
16100 73 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f 6e  se .  if( dataOn
16110 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ly ){.    rc = f
16120 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20 20  datasync(fd);.  
16130 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
16140 20 26 26 20 72 63 3d 3d 2d 31 20 26 26 20 65 72   && rc==-1 && er
16150 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
16160 20 20 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63        rc = fsync
16170 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  (fd);.    }.  }e
16180 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  lse{.    rc = fs
16190 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
161a0 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
161b0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
161c0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
161d0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
161e0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
161f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
16200 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16210 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
16220 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
16230 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
16240 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
16250 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
16260 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
16270 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
16280 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
16290 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
162a0 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
162b0 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
162c0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
162d0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
162e0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
162f0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
16300 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
16310 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
16320 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
16330 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
16340 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
16350 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
16360 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
16370 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
16380 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
16390 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
163a0 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
163b0 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
163c0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
163d0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
163e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
163f0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
16400 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
16410 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
16420 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
16430 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
16440 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
16450 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
16460 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
16470 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
16480 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
16490 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
164a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
164b0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
164c0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
164d0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
164e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
164f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16500 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
16510 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
16520 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
16530 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16540 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16550 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
16560 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
16570 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
16580 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
16590 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
165a0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
165b0 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
165c0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
165d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
165e0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
165f0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
16600 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
16610 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
16620 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
16630 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
16640 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
16650 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
16660 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
16670 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
16680 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
16690 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
166a0 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
166b0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
166c0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
166d0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
166e0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
166f0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
16700 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
16710 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16720 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
16730 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
16740 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
16750 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
16760 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
16770 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
16780 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16790 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
167a0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
167b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
167c0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
167d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
167e0 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
167f0 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
16800 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20  {.    int err;. 
16810 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52     OSTRACE4("DIR
16820 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f  SYNC %-3d (have_
16830 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
16840 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
16850 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20  ile->dirfd,.    
16860 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
16870 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
16880 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nc);.#ifndef SQL
16890 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
168a0 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
168b0 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
168c0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
168d0 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
168e0 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
168f0 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
16900 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
16910 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
16920 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
16930 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
16940 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
16950 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
16960 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
16970 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e  NC || !isFullsyn
16980 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
16990 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
169a0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
169b0 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
169c0 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
169d0 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
169e0 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
169f0 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
16a00 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
16a10 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
16a20 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
16a30 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
16a40 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
16a50 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
16a60 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
16a70 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
16a80 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
16a90 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
16aa0 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
16ab0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
16ac0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16ad0 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20  o = errno; */.  
16ae0 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
16af0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
16b00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16b10 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
16b20 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f  le->dirfd); /* O
16b30 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
16b40 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
16b50 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  the */.    if( e
16b60 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  rr==0 ){        
16b70 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f        /* directo
16b80 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
16b90 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  one */.      pFi
16ba0 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
16bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16bc0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16bd0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
16be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16bf0 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
16c00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16c10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
16c20 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
16c30 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
16c40 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
16c50 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
16c60 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
16c70 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
16c80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
16c90 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
16ca0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
16cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16cc0 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
16cd0 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
16ce0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
16cf0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
16d00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16d10 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
16d20 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
16d30 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
16d40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
16d50 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
16d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16d70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
16d80 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
16d90 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
16da0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
16db0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
16dc0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
16dd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16de0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
16df0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
16e00 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
16e10 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
16e20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
16e30 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
16e40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16e50 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
16e60 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
16e70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
16e80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
16e90 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
16ea0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
16eb0 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
16ec0 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
16ed0 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
16ee0 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
16ef0 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c  abase, the findL
16f00 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  ockInfo() proced
16f10 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
16f20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
16f30 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
16f40 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
16f50 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
16f60 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
16f70 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
16f80 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
16f90 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
16fa0 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
16fb0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
16fc0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
16fd0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
16fe0 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
16ff0 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
17000 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
17010 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
17020 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
17030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17040 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61  _OK;.}../*.** Ha
17050 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
17060 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
17070 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
17080 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
17090 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
170a0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
170b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
170c0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
170d0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
170e0 2c 76 6f 69 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ,void*);.../*.**
170f0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
17100 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
17110 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
17120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
17130 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
17140 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17150 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
17160 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
17170 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
17180 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
17190 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
171a0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
171b0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
171c0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
171d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
171e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
171f0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
17200 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
17210 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
17220 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
17230 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
17240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17250 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
17260 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
17270 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 44  E && defined(__D
17280 41 52 57 49 4e 5f 5f 29 0a 20 20 20 20 63 61 73  ARWIN__).    cas
17290 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
172a0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
172b0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
172c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
172d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
172e0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
172f0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
17300 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
17310 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17320 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
17330 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 2a  ed(__DARWIN__) *
17340 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
17350 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
17360 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17370 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
17380 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
17390 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
173a0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
173b0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
173c0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
173d0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
173e0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
173f0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
17400 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
17410 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
17420 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
17430 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
17440 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
17450 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
17460 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
17470 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
17480 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
17490 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
174a0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
174b0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
174c0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
174d0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
174e0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
174f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
17500 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
17510 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
17520 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
17530 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
17540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
17550 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
17560 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
17570 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
17580 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
17590 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  or the file. Thi
175a0 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f  s is always 0 fo
175b0 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
175c0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
175d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
175e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
175f0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
17600 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
17610 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
17620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
17630 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
17640 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
17650 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
17660 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
17670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17680 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
17690 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
176a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
176c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17700 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
17710 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
17720 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
17730 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
17740 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
17750 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
17760 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
17770 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
17780 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
17790 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
177a0 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
177b0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
177c0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
177d0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
177e0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
177f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
17800 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
17810 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
17820 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
17830 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
17840 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
17850 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
17860 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
17870 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
17880 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
17890 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
178a0 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
178b0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
178c0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
178d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
178e0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
178f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
17900 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
17910 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
17920 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
17930 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
17940 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
17950 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
17960 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
17970 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
17980 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
17990 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
179a0 74 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  t..**.**.** Each
179b0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
179c0 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
179d0 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
179e0 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
179f0 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
17a00 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
17a10 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
17a20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
17a30 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
17a40 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
17a50 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
17a60 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
17a70 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
17a80 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
17a90 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
17aa0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
17ab0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
17ac0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
17ad0 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
17ae0 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
17af0 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
17b00 4f 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  OD, CLOSE, LOCK,
17b10 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17b30 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
17b40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
17b50 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
17b80 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ba0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
17bd0 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bf0 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
17c20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c40 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
17c70 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
17c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
17c90 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
17cc0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
17cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
17ce0 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
17d10 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
17d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
17d30 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
17d60 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
17d70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
17d80 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
17db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17dc0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
17dd0 20 2a 2f 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 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
17e00 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
17e10 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
17e20 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
17e50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17e60 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
17e70 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
17ea0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
17eb0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
17ec0 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
17ef0 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
17f00 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
17f10 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
17f40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
17f50 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70     /* xDeviceCap
17f60 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20                  
17fd0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
17fe0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
17ff0 73 20 2a 46 49 4e 44 45 52 28 63 6f 6e 73 74 20  s *FINDER(const 
18000 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 68 29 7b  char *z, int h){
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18020 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18030 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
18040 41 52 41 4d 45 54 45 52 28 68 29 3b 20 20 20 20  ARAMETER(h);    
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 20 20 5c 0a                \.
18070 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
18080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 5c 0a 7d               \.}
180c0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
180d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
180e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
180f0 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
18100 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
18110 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
18120 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
18130 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
18140 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
18150 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
18160 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
18170 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
18180 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
18190 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
181a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
181b0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
181c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
181d0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
181e0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78  t name */.  unix
181f0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
18200 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
18210 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
18220 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
18230 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
18240 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
18250 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
18260 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
18270 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
18280 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
18290 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k     /* xCheckR
182a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
182b0 6f 64 20 2a 2f 0a 29 3b 0a 49 4f 4d 45 54 48 4f  od */.);.IOMETHO
182c0 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
182d0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
182e0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
182f0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
18300 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
18310 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
18320 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
18330 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ect name */.  no
18340 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
18350 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
18360 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
18370 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
18380 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
18390 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
183a0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
183b0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
183c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
183d0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
183e0 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
183f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
18400 74 68 6f 64 20 2a 2f 0a 29 3b 0a 49 4f 4d 45 54  thod */.);.IOMET
18410 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49  HODS(.  dotlockI
18420 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
18430 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
18440 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  tion name */.  d
18450 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  otlockIoMethods,
18460 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
18470 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
18480 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
18490 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
184a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
184b0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
184c0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
184d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
184e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
184f0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
18500 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
18510 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
18520 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
18530 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
18540 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
18550 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a 0a 23 69  method */.);..#i
18560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18570 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
18580 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
18590 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
185a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
185b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
185c0 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
185d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
185e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
185f0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
18600 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18620 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
18630 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18650 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
18660 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
18670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18680 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
18690 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
186a0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
186b0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
186c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a  ck method */.);.
186d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
186e0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
186f0 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18710 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
18720 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
18730 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
18740 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
18750 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
18760 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 43  t name */.  semC
18770 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
18780 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
18790 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
187a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
187b0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
187c0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
187d0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
187e0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
187f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
18800 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
18810 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
18820 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
18830 6f 64 20 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 0a  od */.);.#endif.
18840 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44  .#if defined(__D
18850 41 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49  ARWIN__) && SQLI
18860 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18870 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
18880 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
18890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
188a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
188b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
188c0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
188d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
188e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
188f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  ct name */.  afp
18900 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
18910 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
18920 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
18930 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
18940 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
18950 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
18960 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
18970 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
18980 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
18990 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
189a0 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
189b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
189c0 68 6f 64 20 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66  hod */.);.#endif
189d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
189e0 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
189f0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
18a00 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
18a10 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
18a20 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
18a30 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
18a40 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
18a50 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
18a60 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
18a70 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
18a80 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
18a90 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
18aa0 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
18ab0 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
18ac0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
18ad0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
18ae0 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
18af0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
18b00 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
18b10 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
18b20 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
18b30 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
18b40 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
18b50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
18b60 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
18b70 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
18b80 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
18b90 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
18ba0 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
18bb0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
18bc0 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
18bd0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
18be0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
18bf0 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
18c00 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
18c10 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
18c20 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
18c30 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
18c40 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
18c50 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
18c60 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
18c70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
18c80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
18c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
18ca0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
18cb0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
18cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18cd0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
18ce0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
18cf0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
18d00 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
18d10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
18d20 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
18d30 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
18d40 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
18d50 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
18d60 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
18d70 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
18d80 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
18d90 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
18da0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
18db0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
18dc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
18dd0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
18de0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
18df0 64 20 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 0a 0a  d */.);.#endif..
18e00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44  .#if defined(__D
18e10 41 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49  ARWIN__) && SQLI
18e20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18e30 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
18e40 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
18e50 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
18e60 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
18e70 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
18e80 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
18e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18ea0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
18eb0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
18ec0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
18ed0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
18ee0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
18ef0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
18f00 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
18f10 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
18f20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
18f30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
18f40 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
18f50 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
18f60 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
18f70 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
18f80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
18f90 6e 74 20 66 64 20 20 20 20 20 20 20 20 20 20 20  nt fd           
18fa0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
18fb0 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
18fc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18fd0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
18fe0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
18ff0 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
19000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
19010 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
19020 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
19030 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
19040 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
19050 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
19060 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
19070 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
19080 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
19090 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
190a0 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
190b0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
190c0 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
190d0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
190e0 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
190f0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
19100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19110 4e 41 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e  NABLE_AFP_LOCKIN
19120 47 5f 53 4d 42 0a 20 20 20 20 7b 20 22 73 6d 62  G_SMB.    { "smb
19130 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
19140 6f 64 73 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20  ods },.#else.   
19150 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 66 6c   { "smbfs",  &fl
19160 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
19170 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 77 65  #endif.    { "we
19180 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
19190 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
191a0 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
191b0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
191c0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
191d0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
191e0 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
191f0 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
19200 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
19210 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
19220 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
19230 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
19240 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
19250 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
19260 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
19270 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
19280 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
19290 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
192a0 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
192b0 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
192c0 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
192d0 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
192e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
192f0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
19300 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
19310 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
19320 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
19330 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
19340 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
19350 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
19360 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
19370 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
19380 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
19390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193a0 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
193b0 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
193c0 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
193d0 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
193e0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
193f0 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
19400 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
19410 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
19420 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
19430 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
19440 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
19450 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
19460 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
19470 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
19480 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
19490 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
194a0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
194b0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
194c0 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 66  K;.  if( fcntl(f
194d0 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  d, F_GETLK, &loc
194e0 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
194f0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
19500 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
19510 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
19520 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
19530 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
19540 2a 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  * defined(__DARW
19550 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  IN__) && SQLITE_
19560 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19570 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
19580 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
19590 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
195a0 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
195b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
195c0 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
195d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
195e0 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
195f0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
19600 74 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  t);.../*********
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
19680 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196a0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
196b0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
196c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
196d0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
196e0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
196f0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
19700 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
19710 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19720 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
19730 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
19740 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
19750 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
19760 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
19770 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
19780 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19790 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
197a0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
197b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
197c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
197d0 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
197e0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
197f0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
19800 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
19810 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
19820 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19830 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
19840 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
19850 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
19860 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
19870 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
19880 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19890 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
198a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
198b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
198c0 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
198d0 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
198e0 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
198f0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
19900 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
19910 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
19920 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
19930 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
19940 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
19950 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
19960 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
19970 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
19980 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ert( pNew->pLock
19990 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ==NULL );.  asse
199a0 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d  rt( pNew->pOpen=
199b0 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
199c0 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
199d0 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
199e0 6e 20 76 78 77 6f 72 6b 73 2e 0a 20 20 2a 2a 20  n vxworks..  ** 
199f0 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70  Express this exp
19a00 6c 69 63 69 74 6c 79 20 68 65 72 65 20 74 6f 20  licitly here to 
19a10 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
19a20 20 77 61 72 6e 69 6e 67 73 0a 20 20 2a 2a 20 61   warnings.  ** a
19a30 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
19a40 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 23 69 66  meters..  */.#if
19a50 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 55   !OS_VXWORKS.  U
19a60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19a70 69 73 44 65 6c 65 74 65 29 3b 0a 23 65 6e 64 69  isDelete);.#endi
19a80 66 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f  f..  OSTRACE3("O
19a90 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
19aa0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
19ab0 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20  ;    .  pNew->h 
19ac0 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72  = h;.  pNew->dir
19ad0 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45  fd = dirfd;.  SE
19ae0 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29  T_THREADID(pNew)
19af0 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
19b00 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
19b10 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
19b20 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
19b30 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
19b40 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d   ){.    noLock =
19b50 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
19b60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
19b70 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c  endif..  if( noL
19b80 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
19b90 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
19ba0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
19bb0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
19bc0 6e 67 53 74 79 6c 65 20 3d 20 28 2a 28 66 69 6e  ngStyle = (*(fin
19bd0 64 65 72 5f 74 79 70 65 29 70 56 66 73 2d 3e 70  der_type)pVfs->p
19be0 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
19bf0 6d 65 2c 20 68 29 3b 0a 23 69 66 20 53 51 4c 49  me, h);.#if SQLI
19c00 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19c10 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
19c20 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
19c30 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
19c40 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
19c50 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
19c60 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
19c70 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
19c80 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
19c90 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
19ca0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
19cb0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
19cc0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
19cd0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
19ce0 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
19cf0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
19d00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
19d10 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
19d20 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
19d30 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
19d40 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
19d50 64 73 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  ds ){.    unixEn
19d60 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
19d70 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
19d80 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
19d90 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  Lock, &pNew->pOp
19da0 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  en);.    unixLea
19db0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
19dc0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
19dd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
19de0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52  && defined(__DAR
19df0 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
19e00 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
19e10 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
19e20 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
19e30 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
19e40 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
19e50 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
19e60 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
19e70 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
19e80 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
19e90 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
19ea0 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
19eb0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
19ec0 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
19ed0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
19ee0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
19ef0 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
19f00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19f10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
19f20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
19f30 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
19f40 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
19f50 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
19f60 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
19f70 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
19f80 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
19f90 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
19fa0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
19fb0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
19fc0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
19fd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
19fe0 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
19ff0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 73 72 61 6e  name;.      sran
1a000 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
1a010 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1a020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
1a030 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1a040 4e 55 4c 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  NULL, &pNew->pOp
1a050 65 6e 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c  en);.      unixL
1a060 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
1a070 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
1a080 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1a090 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1a0a0 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 20 69 66  _STYLE.  else if
1a0b0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1a0c0 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
1a0d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
1a0e0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
1a0f0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
1a100 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
1a110 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
1a120 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
1a130 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
1a140 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
1a150 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
1a160 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
1a170 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
1a180 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d   strlen(zFilenam
1a190 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
1a1a0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
1a1b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1a1c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
1a1d0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
1a1e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a1f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1a200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1a210 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
1a220 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
1a230 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
1a240 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
1a250 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1a260 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
1a270 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
1a280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1a290 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
1a2a0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
1a2b0 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
1a2c0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
1a2d0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
1a2e0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
1a2f0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
1a300 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1a310 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
1a320 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
1a330 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
1a340 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1a350 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
1a360 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26  LockInfo(pNew, &
1a370 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e  pNew->pLock, &pN
1a380 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ew->pOpen);.    
1a390 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1a3a0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f  OK) && (pNew->pO
1a3b0 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  pen->pSem==NULL)
1a3c0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1a3d0 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
1a3e0 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65  >pOpen->aSemName
1a3f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
1a400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1a410 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1a420 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 25  ME, zSemName, "%
1a430 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a450 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
1a460 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
1a470 20 66 6f 72 28 20 6e 3d 30 3b 20 7a 53 65 6d 4e   for( n=0; zSemN
1a480 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
1a490 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
1a4a0 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
1a4b0 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
1a4c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65        pNew->pOpe
1a4d0 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  n->pSem = sem_op
1a4e0 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
1a4f0 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
1a500 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
1a510 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53  pOpen->pSem == S
1a520 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
1a530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a540 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1a550 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65  pNew->pOpen->aSe
1a560 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
1a570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a580 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
1a590 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
1a5a0 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45    .  pNew->lastE
1a5b0 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53  rrno = 0;.#if OS
1a5c0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1a5d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a5e0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
1a5f0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c  name);.    isDel
1a600 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ete = 0;.  }.  p
1a610 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20  New->isDelete = 
1a620 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66  isDelete;.#endif
1a630 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a650 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
1a660 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
1a670 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  nt leak if fail,
1a680 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
1a690 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 68  r */.    close(h
1a6a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a6b0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
1a6c0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
1a6d0 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
1a6e0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1a6f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1a700 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1a710 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1a720 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1a730 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1a740 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a750 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1a760 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1a770 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1a780 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1a790 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1a7a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1a7b0 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1a7c0 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1a7d0 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1a7e0 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1a7f0 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1a800 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1a810 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1a820 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1a830 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1a840 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
1a850 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
1a860 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
1a870 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
1a880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1a890 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
1a8a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1a8b0 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
1a8c0 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
1a8d0 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
1a8e0 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
1a8f0 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
1a900 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1a910 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
1a920 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
1a930 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 73  ame);.  for(ii=s
1a940 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1a950 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61   ii>=0 && zDirna
1a960 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1a970 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1a980 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1a990 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1a9a0 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
1a9b0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1a9c0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1a9d0 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
1a9e0 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
1a9f0 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
1aa00 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
1aa10 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
1aa20 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
1aa30 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  f.      OSTRACE3
1aa40 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1aa50 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1aa60 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1aa70 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1aa80 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1aa90 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e  TE_OK:SQLITE_CAN
1aaa0 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TOPEN);.}../*.**
1aab0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
1aac0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
1aad0 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
1aae0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
1aaf0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1ab00 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
1ab10 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
1ab20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
1ab30 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
1ab40 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
1ab50 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
1ab60 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1ab70 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1ab80 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1ab90 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
1aba0 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
1abb0 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
1abc0 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
1abd0 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
1abe0 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73     ".",.  };.  s
1abf0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1ac00 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
1ac10 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
1ac20 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
1ac30 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
1ac40 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
1ac50 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
1ac60 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
1ac70 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
1ac80 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1ac90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aca0 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
1acb0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
1acc0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
1acd0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
1ace0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
1acf0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
1ad00 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
1ad10 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1ad20 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1ad30 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1ad40 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
1ad50 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
1ad60 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1ad70 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
1ad80 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
1ad90 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1ada0 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c  tory;.  if (NULL
1adb0 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b   == azDirs[1]) {
1adc0 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d  .    azDirs[1] =
1add0 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
1ade0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28  );.  }.  .  for(
1adf0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
1ae00 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
1ae10 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
1ae20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d     if( azDirs[i]
1ae30 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1ae40 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44      if( stat(azD
1ae50 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20  irs[i], &buf) ) 
1ae60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1ae70 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
1ae80 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
1ae90 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ue;.    if( acce
1aea0 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37  ss(azDirs[i], 07
1aeb0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1aec0 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
1aed0 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  i];.    break;. 
1aee0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
1aef0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
1af00 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
1af10 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
1af20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
1af30 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
1af40 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
1af50 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
1af60 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
1af70 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
1af80 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1af90 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
1afa0 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
1afb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1afc0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1afd0 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
1afe0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
1aff0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
1b000 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1b010 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
1b020 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66   j = strlen(zBuf
1b030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1b040 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
1b050 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
1b060 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1b070 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
1b080 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
1b090 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
1b0a0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
1b0b0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
1b0c0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
1b0d0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
1b0e0 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
1b0f0 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
1b100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b110 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
1b120 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
1b130 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
1b140 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
1b150 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
1b160 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
1b170 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
1b180 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
1b190 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
1b1a0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
1b1b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
1b1c0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1b1d0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
1b1e0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
1b1f0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
1b200 68 61 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  har*);.../*.** O
1b210 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
1b220 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
1b230 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
1b240 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
1b250 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
1b260 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
1b270 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
1b280 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
1b290 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
1b2a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
1b2b0 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
1b2c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
1b2d0 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
1b2e0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
1b2f0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
1b300 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
1b310 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
1b320 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
1b330 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
1b340 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
1b350 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
1b360 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
1b370 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
1b380 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
1b390 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
1b3a0 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
1b3b0 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
1b3c0 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
1b3d0 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
1b3e0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
1b3f0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
1b400 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
1b410 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
1b420 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
1b430 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
1b440 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
1b450 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
1b460 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
1b470 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
1b480 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
1b490 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
1b4a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
1b4b0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
1b4c0 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
1b4d0 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
1b4e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1b4f0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
1b500 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1b510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b520 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
1b530 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
1b540 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
1b550 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1b560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
1b570 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
1b580 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
1b590 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1b5a0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
1b5b0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1b5c0 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
1b5d0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
1b5e0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1b5f0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
1b600 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
1b610 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
1b620 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b640 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
1b650 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
1b660 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   core */.){.  in
1b670 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b690 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1b6a0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
1b6b0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
1b6c0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
1b6d0 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
1b6e0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
1b6f0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  tor */.  int ope
1b700 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
1b710 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1b720 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
1b730 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
1b740 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
1b750 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
1b760 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
1b770 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
1b7a0 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
1b7b0 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
1b7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1b7d0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
1b7e0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
1b7f0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1b800 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
1b810 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
1b820 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1b830 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
1b840 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
1b850 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1b860 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1b870 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
1b880 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
1b890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b8a0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
1b8b0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
1b8c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1b8d0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 20  N_READWRITE);.. 
1b8e0 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
1b8f0 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
1b900 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
1b910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
1b920 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
1b930 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
1b940 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1b950 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
1b960 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
1b970 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
1b980 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
1b990 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
1b9a0 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
1b9b0 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
1b9c0 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65    int isOpenDire
1b9d0 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74  ctory = (isCreat
1b9e0 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54 79  e && .      (eTy
1b9f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ba00 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
1ba10 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1ba20 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1ba30 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  L).  );..  /* If
1ba40 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
1ba50 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
1ba60 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
1ba70 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1ba80 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
1ba90 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
1baa0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
1bab0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
1bac0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
1bad0 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
1bae0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63  PATHNAME+1];.  c
1baf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1bb00 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
1bb10 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
1bb20 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
1bb30 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
1bb40 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
1bb50 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
1bb60 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
1bb70 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
1bb80 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
1bb90 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
1bba0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
1bbb0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
1bbc0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
1bbd0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
1bbe0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
1bbf0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
1bc00 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
1bc10 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
1bc20 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
1bc30 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1bc40 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1bc50 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
1bc60 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
1bc70 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
1bc80 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
1bc90 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
1bca0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
1bcb0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1bcc0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
1bcd0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
1bce0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
1bcf0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
1bd00 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
1bd10 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
1bd20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61   main journal, a
1bd30 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
1bd40 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f  l are never auto
1bd50 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64  matically.  ** d
1bd60 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73  eleted.  */.  as
1bd70 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c  sert( eType!=SQL
1bd80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1bd90 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b   || !isDelete );
1bda0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1bdb0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1bdc0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69  IN_JOURNAL || !i
1bdd0 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73  sDelete );.  ass
1bde0 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
1bdf0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1be00 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c  OURNAL || !isDel
1be10 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  ete );..  /* Ass
1be20 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
1be30 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
1be40 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
1be50 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
1be60 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
1be70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1be80 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
1be90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1bea0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
1beb0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1bec0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1bed0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
1bee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1bef0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
1bf00 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1bf10 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1bf20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1bf30 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1bf40 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
1bf50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1bf60 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1bf70 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  DB.  );..  memse
1bf80 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
1bf90 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
1bfa0 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a    if( !zName ){.
1bfb0 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
1bfc0 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69  ete && !isOpenDi
1bfd0 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63  rectory);.    rc
1bfe0 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d   = getTempname(M
1bff0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
1c000 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
1c010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c020 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c030 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
1c040 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
1c050 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
1c060 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
1c070 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
1c080 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
1c090 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
1c0a0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
1c0b0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
1c0c0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
1c0d0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
1c0e0 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
1c0f0 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
1c100 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
1c110 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
1c120 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
1c130 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61  .  fd = open(zNa
1c140 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 69  me, openFlags, i
1c150 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c  sDelete?0600:SQL
1c160 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1c170 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
1c180 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45 4e 58   OSTRACE4("OPENX
1c190 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
1c1a0 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
1c1b0 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
1c1c0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
1c1d0 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
1c1e0 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
1c1f0 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46  sive ){.    /* F
1c200 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
1c210 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
1c220 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
1c230 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
1c240 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
1c250 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1c260 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
1c270 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c  _CREATE);.    fl
1c280 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
1c290 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1c2a0 20 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e   return unixOpen
1c2b0 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46  (pVfs, zPath, pF
1c2c0 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74  ile, flags, pOut
1c2d0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Flags);.  }.  if
1c2e0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
1c2f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1c300 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OPEN;.  }.  if( 
1c310 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
1c320 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
1c330 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
1c340 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
1c350 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
1c360 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
1c370 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c380 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 28 28  E.  else{.    ((
1c390 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
1c3a0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
1c3b0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
1c3c0 64 69 66 0a 20 20 69 66 28 20 70 4f 75 74 46 6c  dif.  if( pOutFl
1c3d0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
1c3e0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
1c3f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 66 64 21   }..  assert(fd!
1c400 3d 30 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  =0);.  if( isOpe
1c410 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  nDirectory ){.  
1c420 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
1c430 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72  tory(zPath, &dir
1c440 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
1c450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c460 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
1c470 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
1c480 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79  if fail, already
1c490 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   in error */.   
1c4a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c4b0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1c4c0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e  FD_CLOEXEC.  fcn
1c4d0 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
1c4e0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
1c4f0 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
1c500 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
1c510 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
1c520 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c530 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  DB;..#if SQLITE_
1c540 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
1c550 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50 61 74 68  KING.  if( zPath
1c560 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f 4c 6f 63  !=NULL && !noLoc
1c570 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  k ){.    char *e
1c580 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
1c590 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
1c5a0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
1c5b0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
1c5c0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
1c5d0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
1c5e0 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
1c5f0 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
1c600 73 65 20 70 72 6f 78 79 2c 20 0a 20 20 20 20 2a  se proxy, .    *
1c610 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76 65 72 20  * 0 means never 
1c620 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
1c630 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
1c640 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
1c650 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2f 0a  les only.    */.
1c660 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
1c670 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
1c680 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
1c690 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
1c6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
1c6b0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
1c6c0 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  fo;..      if( s
1c6d0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
1c6e0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 09  Info) == -1 ){..
1c6f0 09 09 09 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ...((unixFile*)p
1c700 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
1c710 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1c720 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
1c730 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f   close(dirfd); /
1c740 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
1c750 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
1c760 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6c 6f  r */.        clo
1c770 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  se(fd); /* silen
1c780 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
1c790 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
1c7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c7b0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1c7c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c7d0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
1c7e0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
1c7f0 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
1c800 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
1c810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
1c820 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
1c830 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69  , fd, dirfd, pFi
1c840 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63  le, zPath, noLoc
1c850 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 20 20  k, isDelete);.  
1c860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c880 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
1c890 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
1c8a0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
1c8b0 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
1c8c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
1c8d0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
1c8e0 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  dif.  .  return 
1c8f0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
1c900 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
1c910 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
1c920 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
1c930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1c940 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
1c950 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
1c960 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
1c970 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
1c980 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
1c990 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
1c9a0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1c9b0 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
1c9c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c9d0 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
1c9e0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
1c9f0 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
1ca00 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
1ca10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1ca20 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1ca30 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
1ca40 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
1ca50 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
1ca60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1ca70 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
1ca80 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
1ca90 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
1caa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cab0 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
1cac0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1cad0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cae0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
1caf0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
1cb00 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b    unlink(zPath);
1cb10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cb20 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
1cb30 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b    if( dirSync ){
1cb40 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
1cb50 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
1cb60 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b  ory(zPath, &fd);
1cb70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cb80 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53  ITE_OK ){.#if OS
1cb90 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69  _VXWORKS.      i
1cba0 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31  f( fsync(fd)==-1
1cbb0 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69   ).#else.      i
1cbc0 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23  f( fsync(fd) ).#
1cbd0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1cbe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cbf0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
1cc00 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  C;.      }.     
1cc10 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26   if( close(fd)&&
1cc20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !rc ){.        r
1cc30 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1cc40 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
1cc50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1cc60 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
1cc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
1cc80 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
1cc90 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
1cca0 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
1ccb0 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
1ccc0 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
1ccd0 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
1cce0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
1ccf0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
1cd00 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
1cd10 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
1cd20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
1cd30 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
1cd40 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
1cd50 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
1cd60 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
1cd70 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
1cd80 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
1cd90 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1cda0 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
1cdb0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1cdc0 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
1cdd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
1cde0 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
1cdf0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
1ce00 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
1ce10 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
1ce20 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
1ce30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1ce40 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
1ce50 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
1ce60 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
1ce70 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1ce80 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
1ce90 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
1cea0 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
1ceb0 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
1cec0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
1ced0 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
1cee0 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
1cef0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
1cf00 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
1cf10 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1cf20 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
1cf30 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1cf40 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
1cf50 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
1cf60 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
1cf70 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1cf80 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
1cf90 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
1cfa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cfb0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1cfc0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
1cfd0 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
1cfe0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
1cff0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d000 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
1d010 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
1d020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1d030 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1d040 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
1d050 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
1d060 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
1d070 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28 7a  sOut = (access(z
1d080 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
1d090 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d0a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1d0b0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
1d0c0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
1d0d0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
1d0e0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
1d0f0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
1d100 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
1d110 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
1d120 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
1d130 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
1d140 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
1d150 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
1d160 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
1d170 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
1d180 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
1d190 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
1d1a0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
1d1b0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
1d1c0 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
1d1d0 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
1d1e0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1d1f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
1d200 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
1d210 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1d220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d230 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
1d240 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
1d250 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
1d260 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
1d270 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
1d280 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
1d290 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
1d2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d2b0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
1d2c0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
1d2d0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
1d300 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
1d310 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
1d320 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
1d330 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
1d340 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
1d350 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
1d360 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
1d370 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
1d380 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
1d390 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1d3a0 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
1d3b0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
1d3c0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
1d3d0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
1d3e0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
1d3f0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
1d400 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
1d410 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d420 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1d430 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
1d440 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
1d450 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
1d460 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
1d470 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1d480 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
1d490 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
1d4a0 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
1d4b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1d4c0 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
1d4d0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
1d4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1d4f0 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65  nCwd;.    if( ge
1d500 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
1d510 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
1d520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
1d530 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
1d540 20 6e 43 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a   nCwd = strlen(z
1d550 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
1d560 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
1d570 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
1d580 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
1d590 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1d5a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
1d5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d5c0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1d5d0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1d5e0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
1d5f0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1d600 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
1d610 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
1d620 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1d630 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
1d640 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1d650 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
1d660 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
1d670 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
1d680 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1d690 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
1d6a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1d6b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d6c0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1d6d0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
1d6e0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
1d6f0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
1d700 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
1d710 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
1d720 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
1d730 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1d740 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
1d750 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
1d760 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
1d770 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
1d780 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
1d790 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
1d7a0 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
1d7b0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
1d7c0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
1d7d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
1d7e0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
1d7f0 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
1d800 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
1d810 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
1d820 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
1d830 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
1d840 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
1d850 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
1d860 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
1d870 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
1d880 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
1d890 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d8a0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
1d8b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1d8c0 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
1d8d0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
1d8e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1d8f0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
1d900 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
1d910 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
1d920 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
1d930 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
1d940 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
1d950 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
1d960 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
1d970 63 68 61 72 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20  char*zSymbol){. 
1d980 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d990 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1d9a0 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64  turn dlsym(pHand
1d9b0 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
1d9c0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1d9d0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
1d9e0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
1d9f0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
1da00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1da10 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
1da20 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
1da30 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
1da40 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1da50 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
1da60 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
1da70 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
1da80 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
1da90 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
1daa0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
1dab0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
1dac0 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
1dad0 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
1dae0 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
1daf0 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
1db00 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
1db10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
1db30 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1db40 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
1db50 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
1db60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1db70 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
1db80 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
1db90 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
1dba0 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
1dbb0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
1dbc0 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
1dbd0 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
1dbe0 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
1dbf0 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
1dc00 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
1dc10 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
1dc20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
1dc30 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
1dc40 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
1dc50 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
1dc60 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
1dc70 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
1dc80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
1dc90 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
1dca0 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
1dcb0 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
1dcc0 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
1dcd0 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
1dce0 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
1dcf0 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
1dd00 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
1dd10 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
1dd20 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
1dd30 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
1dd40 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
1dd50 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
1dd60 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
1dd70 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
1dd80 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
1dd90 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
1dda0 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
1ddb0 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
1ddc0 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
1ddd0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
1dde0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
1ddf0 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
1de00 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
1de10 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
1de20 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
1de30 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
1de40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1de50 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
1de60 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
1de70 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
1de80 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
1de90 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
1dea0 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
1deb0 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
1dec0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1ded0 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
1dee0 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20  (t));.      pid 
1def0 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
1df00 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
1df10 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
1df20 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
1df30 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
1df40 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69  eof(t)+sizeof(pi
1df50 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
1df60 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
1df70 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
1df80 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65  eof(pid);.    }e
1df90 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20  lse{.      nBuf 
1dfa0 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  = read(fd, zBuf,
1dfb0 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c   nBuf);.      cl
1dfc0 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20  ose(fd);.    }. 
1dfd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1dfe0 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
1dff0 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
1e000 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
1e010 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
1e020 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
1e030 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
1e040 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e050 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
1e060 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
1e070 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1e080 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
1e090 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
1e0a0 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
1e0b0 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
1e0c0 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
1e0d0 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
1e0e0 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
1e0f0 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
1e100 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1e110 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
1e120 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
1e130 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
1e140 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1e150 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
1e160 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
1e170 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
1e180 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
1e190 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
1e1a0 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
1e1b0 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
1e1c0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
1e1d0 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
1e1e0 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
1e1f0 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
1e200 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
1e210 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
1e220 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
1e230 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
1e240 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
1e250 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
1e260 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
1e270 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72  econds);.  retur
1e280 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
1e290 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
1e2a0 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
1e2b0 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
1e2c0 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
1e2d0 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  onds);.  return 
1e2e0 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
1e2f0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
1e300 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1e310 65 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ed);.}../*.** Th
1e320 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1e330 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
1e340 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
1e350 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
1e360 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
1e370 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
1e380 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
1e390 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
1e3a0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
1e3b0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
1e3c0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
1e3d0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
1e3e0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1e3f0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
1e400 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
1e410 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
1e420 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
1e430 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
1e440 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
1e450 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
1e460 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
1e470 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
1e480 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
1e490 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
1e4a0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
1e4b0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
1e4c0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
1e4d0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
1e4e0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
1e4f0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
1e500 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e510 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
1e520 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1e530 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
1e540 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65 66 69 6e  rNow){.#if defin
1e550 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
1e560 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
1e570 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
1e580 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
1e590 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53  0587.5;.#elif OS
1e5a0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1e5b0 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
1e5c0 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
1e5d0 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
1e5e0 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f   &sNow);.  *prNo
1e5f0 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
1e600 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
1e610 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  0.0 + sNow.tv_ns
1e620 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 30 30  ec/8640000000000
1e630 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  0.0;.#else.  str
1e640 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
1e650 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
1e660 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
1e670 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35  rNow = 2440587.5
1e680 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38   + sNow.tv_sec/8
1e690 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76  6400.0 + sNow.tv
1e6a0 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30 30  _usec/8640000000
1e6b0 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0.0;.#endif..#if
1e6c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1e6d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
1e6e0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
1e6f0 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74    *prNow = sqlit
1e700 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f  e3_current_time/
1e710 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
1e720 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  7.5;.  }.#endif.
1e730 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e740 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1e750 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1e760 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
1e770 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
1e780 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
1e790 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
1e7a0 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
1e7b0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
1e7c0 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
1e7d0 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
1e7e0 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
1e7f0 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
1e800 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
1e810 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
1e820 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
1e830 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
1e840 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
1e850 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1e860 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
1e870 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
1e880 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
1e890 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
1e8a0 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
1e8b0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
1e8c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
1e8d0 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
1e8e0 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
1e8f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1e900 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
1e910 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1e920 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
1e930 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1e940 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
1e950 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../*.**********
1e960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1e970 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
1e980 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
1e990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
1ea00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1ea50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea60 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
1ea70 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
1ea80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea90 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
1eaa0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
1eab0 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
1eac0 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
1ead0 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
1eae0 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
1eaf0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
1eb00 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
1eb10 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
1eb20 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
1eb30 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
1eb40 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
1eb50 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
1eb60 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
1eb70 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
1eb80 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
1eb90 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
1eba0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
1ebb0 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
1ebc0 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
1ebd0 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
1ebe0 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
1ebf0 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
1ec00 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
1ec10 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
1ec20 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
1ec30 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
1ec40 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
1ec50 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
1ec60 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
1ec70 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
1ec80 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
1ec90 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
1eca0 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
1ecb0 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
1ecc0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
1ecd0 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
1ece0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
1ecf0 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
1ed00 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
1ed10 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
1ed20 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
1ed30 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
1ed40 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
1ed50 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
1ed60 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
1ed70 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
1ed80 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
1ed90 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
1eda0 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
1edb0 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
1edc0 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
1edd0 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
1ede0 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
1edf0 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
1ee00 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
1ee10 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
1ee20 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
1ee30 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
1ee40 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
1ee50 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
1ee60 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
1ee70 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
1ee80 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
1ee90 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
1eea0 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
1eeb0 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
1eec0 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
1eed0 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
1eee0 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
1eef0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
1ef00 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
1ef10 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
1ef20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
1ef30 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
1ef40 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
1ef50 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
1ef60 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
1ef70 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
1ef80 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20  0..   ..**      
1ef90 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
1efa0 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
1efb0 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
1efc0 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
1efd0 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
1efe0 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
1eff0 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
1f000 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
1f010 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
1f020 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
1f030 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
1f040 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
1f050 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
1f060 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
1f070 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
1f080 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
1f090 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
1f0a0 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
1f0b0 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
1f0c0 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
1f0d0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
1f0e0 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
1f0f0 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
1f100 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
1f110 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
1f120 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
1f130 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
1f140 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
1f150 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
1f160 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
1f170 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
1f180 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
1f190 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
1f1a0 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
1f1b0 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
1f1c0 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
1f1d0 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
1f1e0 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
1f1f0 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
1f200 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
1f210 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
1f220 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
1f230 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
1f240 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
1f250 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
1f260 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
1f270 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
1f280 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
1f290 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
1f2a0 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
1f2b0 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
1f2c0 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
1f2d0 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
1f2e0 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
1f2f0 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
1f300 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
1f310 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
1f320 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
1f330 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
1f340 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
1f350 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
1f360 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
1f370 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
1f380 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
1f390 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
1f3a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
1f3b0 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
1f3c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1f3d0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
1f3e0 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
1f3f0 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
1f420 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
1f430 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
1f440 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
1f450 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
1f460 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
1f470 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
1f480 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
1f490 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
1f4a0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
1f4b0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
1f4c0 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
1f4d0 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
1f4e0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
1f4f0 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
1f500 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
1f510 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
1f520 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
1f530 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
1f540 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
1f550 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
1f560 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
1f570 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
1f580 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
1f590 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
1f5a0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
1f5b0 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
1f5c0 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
1f5d0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
1f5e0 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
1f5f0 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
1f600 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
1f610 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
1f620 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
1f630 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
1f640 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1f650 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
1f660 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
1f670 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
1f680 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
1f690 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
1f6a0 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
1f6b0 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
1f6c0 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
1f6d0 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
1f6e0 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
1f6f0 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
1f700 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
1f710 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
1f720 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
1f730 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
1f740 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
1f750 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
1f760 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
1f770 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
1f780 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
1f790 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
1f7a0 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
1f7b0 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
1f7c0 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
1f7d0 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
1f7e0 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
1f7f0 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
1f800 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
1f810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
1f820 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
1f830 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
1f840 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
1f850 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
1f860 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
1f870 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
1f880 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
1f890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1f8a0 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
1f8b0 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
1f8c0 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
1f8d0 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
1f8e0 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
1f8f0 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
1f900 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
1f910 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
1f920 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
1f930 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
1f940 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
1f950 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
1f960 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
1f970 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
1f980 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
1f990 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
1f9a0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
1f9b0 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
1f9c0 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
1f9d0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
1f9e0 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
1f9f0 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
1fa00 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
1fa10 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
1fa20 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
1fa30 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
1fa40 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
1fa50 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
1fa60 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
1fa70 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
1fa80 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
1fa90 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
1faa0 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
1fab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fac0 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
1fad0 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
1fae0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
1faf0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1fb00 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
1fb10 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
1fb20 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
1fb30 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
1fb40 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
1fb50 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
1fb60 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
1fb70 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
1fb80 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
1fb90 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
1fba0 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
1fbb0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
1fbc0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
1fbd0 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
1fbe0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1fbf0 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
1fc00 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
1fc10 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
1fc20 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
1fc30 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
1fc40 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
1fc50 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
1fc60 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1fc70 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
1fc80 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
1fc90 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
1fca0 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
1fcb0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
1fcc0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
1fcd0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
1fce0 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
1fcf0 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
1fd00 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
1fd10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1fd20 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
1fd30 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
1fd40 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
1fd50 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
1fd60 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
1fd70 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
1fd80 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
1fd90 65 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e)..**.** There 
1fda0 69 73 20 61 20 74 68 69 72 64 20 66 69 6c 65 20  is a third file 
1fdb0 2d 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69  - the host ID fi
1fdc0 6c 65 20 2d 20 75 73 65 64 20 61 73 20 61 20 70  le - used as a p
1fdd0 65 72 73 69 73 74 65 6e 74 20 72 65 63 6f 72 64  ersistent record
1fde0 0a 2a 2a 20 6f 66 20 61 20 75 6e 69 71 75 65 20  .** of a unique 
1fdf0 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
1fe00 68 65 20 68 6f 73 74 2c 20 61 20 31 32 38 2d 62  he host, a 128-b
1fe10 79 74 65 20 75 6e 69 71 75 65 20 68 6f 73 74 20  yte unique host 
1fe20 69 64 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 74 68  id file.** in th
1fe30 65 20 70 61 74 68 20 64 65 66 69 6e 65 64 20 62  e path defined b
1fe40 79 20 74 68 65 20 48 4f 53 54 49 44 50 41 54 48  y the HOSTIDPATH
1fe50 20 6d 61 63 72 6f 20 28 64 65 66 61 75 6c 74 20   macro (default 
1fe60 76 61 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c 69 62  value is.** /Lib
1fe70 72 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d  rary/Caches/.com
1fe80 2e 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e  .apple.sqliteCon
1fe90 63 68 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a 2a  chHostId)..**.**
1fea0 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
1feb0 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
1fec0 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
1fed0 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
1fee0 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
1fef0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
1ff00 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
1ff10 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
1ff20 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
1ff30 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
1ff40 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
1ff50 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
1ff60 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
1ff70 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
1ff80 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
1ff90 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1ffa0 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
1ffb0 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
1ffc0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
1ffd0 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
1ffe0 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
1fff0 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
20000 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
20010 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
20020 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
20030 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
20040 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
20050 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
20060 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
20070 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
20080 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
20090 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
200a0 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
200b0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
200c0 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
200d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
200e0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
200f0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
20100 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
20110 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
20120 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
20130 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
20140 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
20150 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
20160 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
20170 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
20180 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
20190 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
201a0 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
201b0 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
201c0 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
201d0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
201e0 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
201f0 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
20200 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
20210 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
20220 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
20230 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
20240 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
20250 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
20260 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
20270 48 4f 53 54 49 44 50 41 54 48 0a 2a 2a 0a 2a 2a  HOSTIDPATH.**.**
20280 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
20290 20 74 68 65 20 64 65 66 61 75 6c 74 20 68 6f 73   the default hos
202a0 74 20 49 44 20 66 69 6c 65 20 70 61 74 68 20 6c  t ID file path l
202b0 6f 63 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  ocation.**.**  L
202c0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
202d0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
202e0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
202f0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
20300 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
20310 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
20320 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
20330 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
20340 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
20350 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
20360 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
20370 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
20380 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
20390 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
203a0 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
203b0 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
203c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
203d0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
203e0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
203f0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
20400 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
20410 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
20420 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
20430 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
20440 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
20450 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
20460 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
20470 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
20480 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
20490 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
204a0 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
204b0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
204c0 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
204d0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
204e0 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
204f0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
20500 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
20510 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
20520 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
20530 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
20540 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20  plicity calling 
20550 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  the SQLITE_SET_L
20560 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61  OCKPROXYFILE pra
20570 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  gma or.** sqlite
20580 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50  _file_control AP
20590 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65  I is not affecte
205a0 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43  d by SQLITE_FORC
205b0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29  E_PROXY_LOCKING)
205c0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78  ..*/../*.** Prox
205d0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  y locking is onl
205e0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
205f0 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65  acOSX .*/.#if de
20600 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
20610 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
20620 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20630 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20640 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
20650 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
20660 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
20670 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
20680 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
20690 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
206a0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
206b0 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
206c0 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
206d0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
206e0 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
206f0 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
20700 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
20710 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
20720 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
20730 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
20740 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
20750 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
20760 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
20770 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
20780 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
20790 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
207a0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
207b0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
207c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
207d0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
207e0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
207f0 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
20800 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
20810 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
20820 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
20830 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
20840 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
20850 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
20860 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20880 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
20890 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
208a0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
208b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
208c0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
208d0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a  currently held *
208e0 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63  /.  void *oldLoc
208f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
20900 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63   /* Original loc
20910 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72  kingcontext to r
20920 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20  estore on close 
20930 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  */.  sqlite3_io_
20940 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
20950 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f  OldMethod;     /
20960 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d  * Original I/O m
20970 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65  ethods for close
20980 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49   */.};../* HOSTI
20990 44 4c 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45  DLEN and CONCHLE
209a0 4e 20 62 6f 74 68 20 69 6e 63 6c 75 64 65 20 73  N both include s
209b0 70 61 63 65 20 66 6f 72 20 74 68 65 20 73 74 72  pace for the str
209c0 69 6e 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74  ing .** terminat
209d0 69 6e 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66  ing nul .*/.#def
209e0 69 6e 65 20 48 4f 53 54 49 44 4c 45 4e 20 20 20  ine HOSTIDLEN   
209f0 20 20 20 20 20 20 31 32 38 0a 23 64 65 66 69 6e        128.#defin
20a00 65 20 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20  e CONCHLEN      
20a10 20 20 20 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b      (MAXPATHLEN+
20a20 48 4f 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66  HOSTIDLEN+1).#if
20a30 6e 64 65 66 20 48 4f 53 54 49 44 50 41 54 48 0a  ndef HOSTIDPATH.
20a40 23 20 64 65 66 69 6e 65 20 48 4f 53 54 49 44 50  # define HOSTIDP
20a50 41 54 48 20 20 20 20 20 20 20 22 2f 4c 69 62 72  ATH       "/Libr
20a60 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e  ary/Caches/.com.
20a70 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63  apple.sqliteConc
20a80 68 48 6f 73 74 49 64 22 0a 23 65 6e 64 69 66 0a  hHostId".#endif.
20a90 0a 2f 2a 20 62 61 73 69 63 61 6c 6c 79 20 61 20  ./* basically a 
20aa0 63 6f 70 79 20 6f 66 20 75 6e 69 78 52 61 6e 64  copy of unixRand
20ab0 6f 6d 6e 65 73 73 20 77 69 74 68 20 64 69 66 66  omness with diff
20ac0 65 72 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65  erent.** test be
20ad0 68 61 76 69 6f 72 20 62 75 69 6c 74 20 69 6e 20  havior built in 
20ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
20af0 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49  oxyGenerateHostI
20b00 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44 29  D(char *pHostID)
20b10 7b 0a 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c  {.  int pid, fd,
20b20 20 6c 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64   len;.  unsigned
20b30 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e   char *key = (un
20b40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 48  signed char *)pH
20b50 6f 73 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73  ostID;.  .  mems
20b60 65 74 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49  et(key, 0, HOSTI
20b70 44 4c 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30  DLEN);.  len = 0
20b80 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f  ;.  fd = open("/
20b90 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
20ba0 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66  RDONLY);.  if( f
20bb0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20  d>=0 ){.    len 
20bc0 3d 20 72 65 61 64 28 66 64 2c 20 6b 65 79 2c 20  = read(fd, key, 
20bd0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
20be0 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
20bf0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20  lently leak the 
20c00 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a  fd if it fails *
20c10 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20  /.  }.  if( len 
20c20 3c 20 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  < HOSTIDLEN ){. 
20c30 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
20c40 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d   time(&t);.    m
20c50 65 6d 63 70 79 28 6b 65 79 2c 20 26 74 2c 20 73  emcpy(key, &t, s
20c60 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 70  izeof(t));.    p
20c70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
20c80 20 20 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73     memcpy(&key[s
20c90 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
20ca0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
20cb0 20 7d 0a 20 20 0a 23 69 66 64 65 66 20 4d 41 4b   }.  .#ifdef MAK
20cc0 45 5f 50 52 45 54 54 59 5f 48 4f 53 54 49 44 0a  E_PRETTY_HOSTID.
20cd0 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
20ce0 20 20 20 2f 2a 20 66 69 6c 74 65 72 20 74 68 65     /* filter the
20cf0 20 62 79 74 65 73 20 69 6e 74 6f 20 70 72 69 6e   bytes into prin
20d00 74 61 62 6c 65 20 61 73 63 69 69 20 63 68 61 72  table ascii char
20d10 61 63 74 65 72 73 20 61 6e 64 20 4e 55 4c 20 74  acters and NUL t
20d20 65 72 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20  erminate */.    
20d30 6b 65 79 5b 28 48 4f 53 54 49 44 4c 45 4e 2d 31  key[(HOSTIDLEN-1
20d40 29 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 66  )] = 0x00;.    f
20d50 6f 72 28 20 69 3d 30 3b 20 69 3c 28 48 4f 53 54  or( i=0; i<(HOST
20d60 49 44 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b  IDLEN-1); i++ ){
20d70 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
20d80 63 68 61 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d  char pa = key[i]
20d90 26 30 78 37 46 3b 0a 20 20 20 20 20 20 69 66 28  &0x7F;.      if(
20da0 20 70 61 3c 30 78 32 30 20 29 7b 0a 20 20 20 20   pa<0x20 ){.    
20db0 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65      key[i] = (ke
20dc0 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38  y[i]&0x80 == 0x8
20dd0 30 29 20 3f 20 70 61 2b 30 78 34 30 20 3a 20 70  0) ? pa+0x40 : p
20de0 61 2b 30 78 32 30 3b 0a 20 20 20 20 20 20 7d 65  a+0x20;.      }e
20df0 6c 73 65 20 69 66 28 20 70 61 3d 3d 30 78 37 46  lse if( pa==0x7F
20e00 20 29 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b   ){.        key[
20e10 69 5d 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38  i] = (key[i]&0x8
20e20 30 20 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 3d  0 == 0x80) ? pa=
20e30 30 78 32 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a  0x20 : pa+0x7E;.
20e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20e50 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
20e60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20e70 2f 2a 20 77 72 69 74 65 73 20 74 68 65 20 68 6f  /* writes the ho
20e80 73 74 20 69 64 20 70 61 74 68 20 74 6f 20 70 61  st id path to pa
20e90 74 68 2c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  th, path should 
20ea0 62 65 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61  be an pre-alloca
20eb0 74 65 64 20 62 75 66 66 65 72 0a 2a 2a 20 77 69  ted buffer.** wi
20ec0 74 68 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  th enough space 
20ed0 66 6f 72 20 61 20 70 61 74 68 20 0a 2a 2f 0a 73  for a path .*/.s
20ee0 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 78 79  tatic void proxy
20ef0 47 65 74 48 6f 73 74 49 44 50 61 74 68 28 63 68  GetHostIDPath(ch
20f00 61 72 20 2a 70 61 74 68 2c 20 73 69 7a 65 5f 74  ar *path, size_t
20f10 20 6c 65 6e 29 7b 0a 20 20 73 74 72 6c 63 70 79   len){.  strlcpy
20f20 28 70 61 74 68 2c 20 48 4f 53 54 49 44 50 41 54  (path, HOSTIDPAT
20f30 48 2c 20 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20  H, len);.#ifdef 
20f40 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
20f50 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
20f60 5f 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 63 68  _num>0 ){.    ch
20f70 61 72 20 73 75 66 66 69 78 5b 32 5d 20 3d 20 22  ar suffix[2] = "
20f80 31 22 3b 0a 20 20 20 20 73 75 66 66 69 78 5b 30  1";.    suffix[0
20f90 5d 20 3d 20 73 75 66 66 69 78 5b 30 5d 20 2b 20  ] = suffix[0] + 
20fa0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
20fb0 75 6d 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28  um;.    strlcat(
20fc0 70 61 74 68 2c 20 73 75 66 66 69 78 2c 20 6c 65  path, suffix, le
20fd0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  n);.  }.#endif. 
20fe0 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48 4f   OSTRACE3("GETHO
20ff0 53 54 49 44 50 41 54 48 20 20 25 73 20 70 69 64  STIDPATH  %s pid
21000 3d 25 64 5c 6e 22 2c 20 70 61 74 68 2c 20 67 65  =%d\n", path, ge
21010 74 70 69 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67  tpid());.}../* g
21020 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 66  et the host ID f
21030 72 6f 6d 20 61 20 73 71 6c 69 74 65 20 68 6f 73  rom a sqlite hos
21040 74 69 64 20 66 69 6c 65 20 73 74 6f 72 65 64 20  tid file stored 
21050 69 6e 20 74 68 65 20 0a 2a 2a 20 75 73 65 72 2d  in the .** user-
21060 73 70 65 63 69 66 69 63 20 74 6d 70 20 64 69 72  specific tmp dir
21070 65 63 74 6f 72 79 2c 20 63 72 65 61 74 65 20 74  ectory, create t
21080 68 65 20 49 44 20 69 66 20 69 74 27 73 20 6e 6f  he ID if it's no
21090 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  t there already 
210a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
210b0 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 63 68  roxyGetHostID(ch
210c0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
210d0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e 74   *pError){.  int
210e0 20 66 64 3b 0a 20 20 63 68 61 72 20 70 61 74 68   fd;.  char path
210f0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a 20  [MAXPATHLEN]; . 
21100 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20 69   size_t len;.  i
21110 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b  nt rc=SQLITE_OK;
21120 0a 0a 20 20 70 72 6f 78 79 47 65 74 48 6f 73 74  ..  proxyGetHost
21130 49 44 50 61 74 68 28 70 61 74 68 2c 20 4d 41 58  IDPath(path, MAX
21140 50 41 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74  PATHLEN);.  /* t
21150 72 79 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ry to create the
21160 20 68 6f 73 74 20 49 44 20 66 69 6c 65 2c 20 69   host ID file, i
21170 66 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  f it already exi
21180 73 74 73 20 72 65 61 64 20 74 68 65 20 63 6f 6e  sts read the con
21190 74 65 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20  tents */.  fd = 
211a0 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45  open(path, O_CRE
211b0 41 54 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58  AT|O_WRONLY|O_EX
211c0 43 4c 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28  CL, 0644);.  if(
211d0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   fd<0 ){.    int
211e0 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20   err=errno;.... 
211f0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
21200 53 54 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ST ){.#ifdef SQL
21210 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20  ITE_PROXY_DEBUG 
21220 2f 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74  /* set the sqlit
21230 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
21240 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20  instead */.     
21250 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
21260 20 22 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63   "sqlite error c
21270 72 65 61 74 69 6e 67 20 68 6f 73 74 20 49 44 20  reating host ID 
21280 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a  file %s: %s\n",.
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
212a0 74 68 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  th, strerror(err
212b0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
212c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
212d0 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ERM;.    }.    /
212e0 2a 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  * couldn't creat
212f0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 61 64  e the file, read
21300 20 69 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20   it instead */. 
21310 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
21320 68 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58  h, O_RDONLY|O_EX
21330 43 4c 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  CL);.    if( fd<
21340 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
21350 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f  TE_PROXY_DEBUG /
21360 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
21370 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
21380 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20  nstead */.      
21390 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
213a0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
213b0 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65  tderr, "sqlite e
213c0 72 72 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73  rror opening hos
213d0 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73  t ID file %s: %s
213e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
213f0 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f     path, strerro
21400 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a  r(err));.#endif.
21410 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21420 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a  ITE_PERM;.    }.
21430 20 20 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28      len = pread(
21440 66 64 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53  fd, pHostID, HOS
21450 54 49 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  TIDLEN, 0);.    
21460 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
21470 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
21480 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
21490 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
214a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
214b0 6c 65 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b  len<HOSTIDLEN ){
214c0 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  .      *pError =
214d0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   0;.      rc = S
214e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
214f0 54 5f 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20  T_READ;.    }.  
21500 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
21510 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68  silently leak th
21520 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73  e fd if it fails
21530 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33   */.    OSTRACE3
21540 28 22 47 45 54 48 4f 53 54 49 44 20 20 72 65 61  ("GETHOSTID  rea
21550 64 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  d %s pid=%d\n", 
21560 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69 64 28  pHostID, getpid(
21570 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
21580 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
21590 2f 2a 20 77 65 27 72 65 20 63 72 65 61 74 69 6e  /* we're creatin
215a0 67 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69  g the host ID fi
215b0 6c 65 20 28 75 73 65 20 61 20 72 61 6e 64 6f 6d  le (use a random
215c0 20 73 74 72 69 6e 67 20 6f 66 20 62 79 74 65 73   string of bytes
215d0 29 20 2a 2f 0a 20 20 20 20 70 72 6f 78 79 47 65  ) */.    proxyGe
215e0 6e 65 72 61 74 65 48 6f 73 74 49 44 28 70 48 6f  nerateHostID(pHo
215f0 73 74 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  stID);.    len =
21600 20 70 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73   pwrite(fd, pHos
21610 74 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20  tID, HOSTIDLEN, 
21620 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c  0);.    if( len<
21630 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  0 ){.      *pErr
21640 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  or = errno;.    
21650 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
21660 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
21670 65 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53  else if( len<HOS
21680 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  TIDLEN ){.      
21690 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20  *pError = 0;.   
216a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
216b0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
216c0 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b  }.    close(fd);
216d0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
216e0 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66  k the fd if it f
216f0 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52  ails */.    OSTR
21700 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44 20  ACE3("GETHOSTID 
21710 20 77 72 6f 74 65 20 25 73 20 70 69 64 3d 25 64   wrote %s pid=%d
21720 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65  \n", pHostID, ge
21730 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74  tpid());.    ret
21740 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73  urn rc;.  }.}..s
21750 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
21760 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
21770 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
21780 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
21790 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
217a0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
217b0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
217c0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
217d0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
217e0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
217f0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
21800 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
21810 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
21820 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 63  MP_DIR.  {.    c
21830 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
21840 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
21850 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b   lPath, maxLen);
21860 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
21870 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
21880 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
21890 29 3b 0a 20 20 20 20 69 66 28 20 6d 6b 64 69 72  );.    if( mkdir
218a0 28 6c 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 44  (lPath, SQLITE_D
218b0 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
218c0 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
218d0 20 20 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69        /* if mkdi
218e0 72 20 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20  r fails, handle 
218f0 61 73 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65  as lock file cre
21900 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ation failure */
21910 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
21920 20 65 72 72 6e 6f 3b 0a 23 20 20 69 66 64 65 66   errno;.#  ifdef
21930 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21940 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
21950 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66  IST ){.        f
21960 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21970 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
21980 3a 20 6d 6b 64 69 72 28 25 73 2c 30 25 6f 29 20  : mkdir(%s,0%o) 
21990 65 72 72 6f 72 20 25 64 20 25 73 5c 6e 22 2c 20  error %d %s\n", 
219a0 6c 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20  lPath,.         
219b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
219c0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
219d0 45 52 4d 49 53 53 49 4f 4e 53 2c 20 65 72 72 2c  ERMISSIONS, err,
219e0 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b   strerror(err));
219f0 0a 20 20 20 20 20 20 7d 0a 23 20 20 65 6e 64 69  .      }.#  endi
21a00 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
21a10 20 20 20 4f 53 54 52 41 43 45 33 28 22 47 45 54     OSTRACE3("GET
21a20 4c 4f 43 4b 50 41 54 48 20 20 6d 6b 64 69 72 20  LOCKPATH  mkdir 
21a30 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
21a40 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ath, getpid());.
21a50 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 7d 0a 23      }.    .  }.#
21a60 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
21a70 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
21a80 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
21a90 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
21aa0 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
21ab0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
21ac0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
21ad0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
21ae0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
21af0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
21b00 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
21b10 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
21b20 62 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 64 62  bLen = strlen(db
21b30 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
21b40 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
21b50 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20  +len+7)<maxLen; 
21b60 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
21b70 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
21b80 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
21b90 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
21ba0 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
21bb0 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
21bc0 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
21bd0 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
21be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21c00 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65  e a new VFS file
21c10 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f   descriptor (sto
21c20 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  red in memory ob
21c30 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
21c40 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61  qlite3_malloc) a
21c50 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  nd open the file
21c60 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e   named "path" in
21c70 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
21c80 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ptor..**.** The 
21c90 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
21ca0 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66  sible not only f
21cb0 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66  or closing the f
21cc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
21cd0 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66  * but also for f
21ce0 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72  reeing the memor
21cf0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
21d00 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  h the file descr
21d10 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  iptor..*/.static
21d20 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
21d30 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73 74 20 63  UnixFile(const c
21d40 68 61 72 20 2a 70 61 74 68 2c 20 75 6e 69 78 46  har *path, unixF
21d50 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29 20 7b 0a  ile **ppFile) {.
21d60 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20    int fd;.  int 
21d70 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  dirfd = -1;.  un
21d80 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
21d90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21da0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OK;.  sqlite3_vf
21db0 73 20 64 75 6d 6d 79 56 66 73 3b 0a 0a 20 20 66  s dummyVfs;..  f
21dc0 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 4f  d = open(path, O
21dd0 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 2c  _RDWR | O_CREAT,
21de0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
21df0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
21e00 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
21e10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21e20 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
21e30 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
21e40 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
21e50 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 75  _malloc(sizeof(u
21e60 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 69 66 28  nixFile));.  if(
21e70 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
21e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21e90 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
21ea0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
21eb0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
21ec0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
21ed0 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 64 75 6d  ixFile));..  dum
21ee0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
21ef0 20 28 76 6f 69 64 2a 29 61 75 74 6f 6c 6f 63 6b   (void*)autolock
21f00 49 6f 46 69 6e 64 65 72 3b 20 20 0a 20 20 72 63  IoFinder;  .  rc
21f10 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
21f20 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
21f30 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33   dirfd, (sqlite3
21f40 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
21f50 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  h, 0, 0);.  if( 
21f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21f70 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
21f80 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
21f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
21fa0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
21fb0 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29      .  close(fd)
21fc0 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
21fd0 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20  ak fd if error, 
21fe0 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e  we're already in
21ff0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69   error */.  sqli
22000 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
22010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22020 2f 2a 20 74 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* takes the con
22030 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
22040 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
22050 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
22060 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
22070 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
22080 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
22090 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
220a0 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
220b0 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
220c0 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
220d0 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
220e0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
220f0 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
22100 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
22110 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
22120 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
22130 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
22140 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
22150 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
22160 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
22170 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
22180 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
22190 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
221a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
221b0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
221c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
221d0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
221e0 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
221f0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
22200 64 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d>0 ){.    retur
22210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
22220 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
22230 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
22240 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
22250 0a 20 20 20 20 63 68 61 72 20 74 65 73 74 56 61  .    char testVa
22260 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  lue[CONCHLEN];. 
22270 20 20 20 63 68 61 72 20 63 6f 6e 63 68 56 61 6c     char conchVal
22280 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  ue[CONCHLEN];.  
22290 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
222a0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
222b0 20 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61 74 68   char *tLockPath
222c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
222d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
222e0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 52 63 20  .    int readRc 
222f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22300 20 69 6e 74 20 73 79 6e 63 50 65 72 6d 73 20 3d   int syncPerms =
22310 20 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41 43 45   0;..    OSTRACE
22320 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  4("TAKECONCH  %d
22330 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
22340 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
22350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
22360 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
22370 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
22380 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
22390 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
223a0 0a 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  ..    rc = conch
223b0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
223c0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
223d0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
223e0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
223f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
22410 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
22420 20 20 6d 65 6d 73 65 74 28 74 65 73 74 56 61 6c    memset(testVal
22430 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45 4e 29  ue, 0, CONCHLEN)
22440 3b 20 2f 2f 20 63 6f 6e 63 68 20 69 73 20 66 69  ; // conch is fi
22450 78 65 64 20 73 69 7a 65 0a 20 20 20 20 20 20 72  xed size.      r
22460 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
22470 49 44 28 74 65 73 74 56 61 6c 75 65 2c 20 26 70  ID(testValue, &p
22480 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  Error);.      if
22490 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
224a0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
224b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
224c0 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
224d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
224e0 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
224f0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
22500 20 73 74 72 6c 63 70 79 28 26 74 65 73 74 56 61   strlcpy(&testVa
22510 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20  lue[HOSTIDLEN], 
22520 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
22530 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
22540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
22570 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
22580 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  h;.    }.    .  
22590 20 20 72 65 61 64 52 63 20 3d 20 75 6e 69 78 52    readRc = unixR
225a0 65 61 64 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ead((sqlite3_fil
225b0 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 63  e *)conchFile, c
225c0 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48  onchValue, CONCH
225d0 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  LEN, 0);.    if(
225e0 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45 5f   readRc!=SQLITE_
225f0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
22600 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 65   ){.      if( re
22610 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  adRc!=SQLITE_OK 
22620 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
22630 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
22640 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
22650 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
22660 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65  rrno = conchFile
22670 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
22680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
22690 63 20 3d 20 72 65 61 64 52 63 3b 0a 20 20 20 20  c = readRc;.    
226a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
226b0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
226c0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
226d0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
226e0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
226f0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nts */.      if(
22700 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
22710 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
22720 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d   /* for auto-nam
22730 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  ed local lock fi
22740 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74  le, just check t
22750 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77  he host ID and w
22760 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 2a 2a  e'll.         **
22770 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c   use the local l
22780 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68  ock file path th
22790 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20  at's already in 
227a0 74 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20  there */.       
227b0 20 69 66 28 20 21 6d 65 6d 63 6d 70 28 74 65 73   if( !memcmp(tes
227c0 74 56 61 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c  tValue, conchVal
227d0 75 65 2c 20 48 4f 53 54 49 44 4c 45 4e 29 20 29  ue, HOSTIDLEN) )
227e0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 4c 6f 63  {.          tLoc
227f0 6b 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  kPath = (char *)
22800 26 63 6f 6e 63 68 56 61 6c 75 65 5b 48 4f 53 54  &conchValue[HOST
22810 49 44 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  IDLEN];.        
22820 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
22830 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  onch;.        }.
22840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22850 20 20 20 20 20 2f 2a 20 77 65 27 76 65 20 67 6f       /* we've go
22860 74 20 74 68 65 20 63 6f 6e 63 68 20 69 66 20 63  t the conch if c
22870 6f 6e 63 68 56 61 6c 75 65 20 6d 61 74 63 68 65  onchValue matche
22880 73 20 6f 75 72 20 70 61 74 68 20 61 6e 64 20 68  s our path and h
22890 6f 73 74 20 49 44 20 2a 2f 0a 20 20 20 20 20 20  ost ID */.      
228a0 20 20 69 66 28 20 21 6d 65 6d 63 6d 70 28 74 65    if( !memcmp(te
228b0 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63 68 56 61  stValue, conchVa
228c0 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 29 20 29  lue, CONCHLEN) )
228d0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
228e0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
228f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22900 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22910 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65     /* a short re
22920 61 64 20 6d 65 61 6e 73 20 77 65 27 72 65 20 22  ad means we're "
22930 63 72 65 61 74 69 6e 67 22 20 74 68 65 20 63 6f  creating" the co
22940 6e 63 68 20 28 65 76 65 6e 20 74 68 6f 75 67 68  nch (even though
22950 20 69 74 20 63 6f 75 6c 64 20 0a 20 20 20 20 20   it could .     
22960 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 75 73   ** have been us
22970 65 72 2d 69 6e 74 65 72 76 65 6e 74 69 6f 6e 29  er-intervention)
22980 2c 20 69 66 20 77 65 20 61 63 71 75 69 72 65 20  , if we acquire 
22990 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
229a0 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 27  ck,.      ** we'
229b0 6c 6c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ll try to match 
229c0 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 2d 64  the current on-d
229d0 69 73 6b 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  isk permissions 
229e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
229f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22a00 79 6e 63 50 65 72 6d 73 20 3d 20 31 3b 0a 20 20  yncPerms = 1;.  
22a10 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
22a20 65 69 74 68 65 72 20 63 6f 6e 63 68 20 77 61 73  either conch was
22a30 20 65 6d 74 70 79 20 6f 72 20 64 69 64 6e 27 74   emtpy or didn't
22a40 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 69 66   match */.    if
22a50 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
22a60 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
22a70 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
22a80 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
22a90 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
22aa0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 74 4c 6f 63  LEN);.      tLoc
22ab0 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
22ac0 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 70 79 28  ;.      strlcpy(
22ad0 26 74 65 73 74 56 61 6c 75 65 5b 48 4f 53 54 49  &testValue[HOSTI
22ae0 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50 61 74 68 2c  DLEN], lockPath,
22af0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
22b00 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
22b10 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
22b20 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
22b30 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
22b40 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
22b50 0a 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73  .     ** has a s
22b60 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61  hared lock alrea
22b70 64 79 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  dy) */.    rc = 
22b80 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
22b90 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
22ba0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
22bb0 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
22bc0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  CK);.    if( rc=
22bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22be0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
22bf0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
22c00 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 74 65   *)conchFile, te
22c10 73 74 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45  stValue, CONCHLE
22c20 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  N, 0);.      if(
22c30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22c40 26 20 73 79 6e 63 50 65 72 6d 73 20 29 7b 0a 20  & syncPerms ){. 
22c50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74         struct st
22c60 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20  at buf;.        
22c70 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74 28  int err = fstat(
22c80 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
22c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72  .        if( err
22ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22cb0 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68   /* try to match
22cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22cd0 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  le permissions, 
22ce0 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
22cf0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22d00 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
22d10 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f         fchmod(co
22d20 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e  nchFile->h, buf.
22d30 73 74 5f 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  st_mode);.#else.
22d40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 63            if( fc
22d50 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
22d60 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 21  h, buf.st_mode)!
22d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22d80 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
22d90 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
22da0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
22db0 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
22dc0 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
22dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
22df0 66 2e 73 74 5f 6d 6f 64 65 2c 20 63 6f 64 65 2c  f.st_mode, code,
22e00 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
22e10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
22e20 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
22e30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
22e40 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43   "fchmod %o SUCC
22e50 45 44 45 44 5c 6e 22 2c 62 75 66 2e 73 74 5f 6d  EDED\n",buf.st_m
22e60 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
22e70 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
22e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63  .          int c
22e90 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
22ea0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
22eb0 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
22ec0 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
22ed0 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72    err, code, str
22f00 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65  error(code));.#e
22f10 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
22f20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22f30 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
22f40 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
22f50 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
22f60 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
22f70 43 4b 29 3b 0a 20 20 0a 65 6e 64 5f 74 61 6b 65  CK);.  .end_take
22f80 63 6f 6e 63 68 3a 0a 20 20 20 20 4f 53 54 52 41  conch:.    OSTRA
22f90 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE2("TRANSPROXY:
22fa0 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70   CLOSE  %d\n", p
22fb0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69 66  File->h);.    if
22fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22fd0 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  && pFile->openFl
22fe0 61 67 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ags ){.      if(
22ff0 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
23000 23 69 66 64 65 66 20 53 54 52 49 43 54 5f 43 4c  #ifdef STRICT_CL
23010 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  OSE_ERROR.      
23020 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c    if( close(pFil
23030 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20 20 20  e->h) ){.       
23040 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
23050 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
23060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
23070 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
23080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
23090 65 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  e.        close(
230a0 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69  pFile->h); /* si
230b0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69  lently leak fd i
230c0 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66  f fail */.#endif
230d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
230e0 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
230f0 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65      int fd = ope
23100 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
23110 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
23120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23130 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
23140 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
23150 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 4f 53  SIONS);.      OS
23160 54 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f  TRACE2("TRANSPRO
23170 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c  XY: OPEN  %d\n",
23180 20 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20   fd);.      if( 
23190 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
231a0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
231b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
231c0 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43       rc=SQLITE_C
231d0 41 4e 54 4f 50 45 4e 3b 20 2f 2f 20 53 51 4c 49  ANTOPEN; // SQLI
231e0 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
231f0 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 20 64  keConch called d
23200 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 0a 20 20  uring locking.  
23210 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23230 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
23240 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 63  Proxy ){.      c
23250 68 61 72 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63  har *path = tLoc
23260 6b 50 61 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74  kPath ? tLockPat
23270 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
23280 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 2f  oxyPath;.      /
23290 2f 20 41 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d  / ACS: Need to m
232a0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61  ake a copy of pa
232b0 74 68 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  th sometimes.   
232c0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
232d0 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68  ateUnixFile(path
232e0 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  , &pCtx->lockPro
232f0 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  xy);.    }.    i
23300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23310 20 29 7b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   ){.      pCtx->
23320 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 0a  conchHeld = 1;..
23330 20 20 20 20 20 20 69 66 28 20 74 4c 6f 63 6b 50        if( tLockP
23340 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ath ){.        p
23350 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
23360 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
23370 72 44 75 70 28 30 2c 20 74 4c 6f 63 6b 50 61 74  rDup(0, tLockPat
23380 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
23390 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
233a0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
233b0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
233c0 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63 6b         ((afpLock
233d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74  ingContext *)pCt
233e0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f  x->lockProxy->lo
233f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64  ckingContext)->d
23400 62 50 61 74 68 20 3d 0a 20 20 20 20 20 20 20 20  bPath =.        
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74               pCt
23420 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
23430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23440 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
23450 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65  .      conchFile
23460 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
23470 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
23480 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
23490 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LOCK);.    }.   
234a0 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45 43   OSTRACE3("TAKEC
234b0 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
234c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63  conchFile->h, rc
234d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22  ==SQLITE_OK?"ok"
234e0 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  :"failed");.    
234f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d  return rc;.  }.}
23500 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65  ../*.** If pFile
23510 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
23520 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74   a conch file, t
23530 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74  hen release that
23540 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
23550 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73   int proxyReleas
23560 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
23570 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
23580 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23590 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
235a0 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65  tine return code
235b0 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69   */.  proxyLocki
235c0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
235d0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
235e0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   context for the
235f0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20   proxy lock */. 
23600 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
23610 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  File;        /* 
23620 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
23630 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74  h file */..  pCt
23640 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
23650 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
23660 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
23670 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20  ;.  conchFile = 
23680 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
23690 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45 4c  .  OSTRACE4("REL
236a0 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  EASECONCH  %d fo
236b0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
236c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
236d0 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
236e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
236f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
23700 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
23710 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74   .           get
23720 70 69 64 28 29 29 3b 0a 20 20 70 43 74 78 2d 3e  pid());.  pCtx->
23730 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
23740 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
23750 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
23760 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
23770 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
23780 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41 43 45 33  OCK);.  OSTRACE3
23790 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
237a0 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
237b0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
237c0 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
237d0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
237e0 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
237f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
23800 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
23810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
23820 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65  compute the name
23830 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69   of its conch fi
23840 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  le..** Store the
23850 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
23860 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
23870 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
23880 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b  malloc()..** Mak
23890 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f  e *pConchPath po
238a0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  int to the new n
238b0 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ame.  Return SQL
238c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
238d0 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  s.** or SQLITE_N
238e0 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74  OMEM if unable t
238f0 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e  o obtain memory.
23900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
23910 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
23920 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
23930 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  at the allocated
23940 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
23950 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
23960 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f  reed..**.** *pCo
23970 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74  nchPath is set t
23980 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f  o NULL if a memo
23990 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
239a0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
239b0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
239c0 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
239d0 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  me(char *dbPath,
239e0 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
239f0 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  th){.  int i;   
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23a20 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  nter */.  int le
23a30 6e 20 3d 20 73 74 72 6c 65 6e 28 64 62 50 61 74  n = strlen(dbPat
23a40 68 29 3b 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74  h);     /* Lengt
23a50 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
23a60 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
23a70 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
23a80 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
23a90 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
23aa0 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
23ab0 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
23ac0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
23ad0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
23ae0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
23af0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
23b00 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
23b10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
23b20 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
23b30 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
23b40 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
23b50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
23b60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
23b70 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
23b80 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
23b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23ba0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
23bb0 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
23bc0 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
23bd0 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
23be0 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
23bf0 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
23c00 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
23c10 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
23c20 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
23c30 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
23c40 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
23c50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23c60 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
23c70 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
23c80 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
23c90 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
23ca0 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
23cb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
23cc0 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
23cd0 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
23ce0 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
23cf0 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
23d00 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
23d10 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 63  assert( strlen(c
23d20 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
23d30 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
23d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
23d50 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
23d60 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
23d70 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
23d80 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
23d90 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
23da0 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
23db0 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
23dc0 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
23dd0 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
23de0 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
23df0 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
23e00 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
23e10 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
23e20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
23e30 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
23e40 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
23e50 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
23e60 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
23e70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23e80 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
23e90 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
23ea0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
23eb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
23ec0 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
23ed0 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
23ee0 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
23ef0 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
23f00 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
23f10 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
23f20 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
23f30 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
23f40 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
23f50 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
23f60 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
23f70 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
23f80 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
23f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
23fa0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
23fb0 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
23fc0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
23fd0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
23fe0 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
23ff0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
24000 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
24010 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
24020 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
24030 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
24040 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
24050 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
24060 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24070 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
24080 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
24090 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
240a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
240b0 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
240c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
240d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
240e0 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
240f0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
24100 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
24110 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
24120 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
24130 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
24140 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
24150 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
24160 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
24170 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
24180 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
24190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
241a0 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
241b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
241c0 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
241d0 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
241e0 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
241f0 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
24200 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
24210 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
24220 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
24230 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
24240 4e 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  N__).  if( pFile
24250 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
24260 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
24270 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
24280 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
24290 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
242a0 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
242b0 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
242c0 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
242d0 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
242e0 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
242f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
24300 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
24310 20 20 20 73 74 72 63 70 79 28 64 62 50 61 74 68     strcpy(dbPath
24320 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  , ((afpLockingCo
24330 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
24340 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
24350 64 62 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  dbPath);.  }else
24360 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
24370 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
24380 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
24390 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20  s ){.    /* dot 
243a0 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20  lock style uses 
243b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
243c0 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
243d0 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a   dot lock.    **
243e0 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
243f0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
24400 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65  en((char *)pFile
24410 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
24420 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f  ) - strlen(DOTLO
24430 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20  CK_SUFFIX);.    
24440 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28  memcpy(dbPath, (
24450 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
24460 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65  ckingContext, le
24470 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  n + 1);.  }else{
24480 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65  .    /* all othe
24490 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65  r styles use the
244a0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
244b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62   to store the db
244c0 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
244d0 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
244e0 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
244f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
24500 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
24510 20 20 73 74 72 63 70 79 28 64 62 50 61 74 68 2c    strcpy(dbPath,
24520 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
24530 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
24540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24560 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
24570 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
24580 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
24590 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
245a0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
245b0 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
245c0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
245d0 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
245e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
245f0 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
24600 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
24610 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
24620 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
24630 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
24640 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
24650 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
24660 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
24670 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
24680 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
24690 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
246a0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
246b0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
246c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
246d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
246e0 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
246f0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
24700 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
24710 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
24720 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
24730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24740 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
24750 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
24760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24770 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
24780 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
24790 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
247a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
247b0 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  .  proxyGetDbPat
247c0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69  hForUnixFile(pFi
247d0 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69  le, dbPath);.  i
247e0 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
247f0 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
24800 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
24810 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  o:") ){.    lock
24820 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  Path=NULL;.  }el
24830 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68  se{.    lockPath
24840 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20  =(char *)path;. 
24850 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 34   }.  .  OSTRACE4
24860 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
24870 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
24880 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
24890 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74          (lockPat
248a0 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22  h ? lockPath : "
248b0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
248c0 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73  ());..  pCtx = s
248d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
248e0 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
248f0 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
24900 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24910 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
24920 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20  memset(pCtx, 0, 
24930 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a  sizeof(*pCtx));.
24940 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65  .  rc = proxyCre
24950 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
24960 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  (dbPath, &pCtx->
24970 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
24980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24990 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
249a0 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
249b0 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ile(pCtx->conchF
249c0 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  ilePath, &pCtx->
249d0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 7d 20  conchFile);.  } 
249e0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
249f0 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74  TE_OK && lockPat
24a00 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  h ){.    pCtx->l
24a10 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
24a20 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
24a30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d  , lockPath);.  }
24a40 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
24a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
24a60 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
24a70 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
24a80 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
24a90 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
24aa0 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
24ab0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
24ac0 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
24ad0 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
24ae0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
24af0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
24b00 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
24b10 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67  pCtx->oldLocking
24b20 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d  Context = pFile-
24b30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
24b40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
24b50 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
24b60 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c  x;.    pCtx->pOl
24b70 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d  dMethod = pFile-
24b80 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46  >pMethod;.    pF
24b90 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
24ba0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a  proxyIoMethods;.
24bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
24bc0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
24bd0 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20   ){ .      rc = 
24be0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d  pCtx->conchFile-
24bf0 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
24c00 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
24c10 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  )pCtx->conchFile
24c20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
24c30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
24c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24c50 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
24c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24c70 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
24c80 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a  onchFilePath); .
24c90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24ca0 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53  (pCtx);.  }.  OS
24cb0 54 52 41 43 45 33 28 22 54 52 41 4e 53 50 52 4f  TRACE3("TRANSPRO
24cc0 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46  XY  %d %s\n", pF
24cd0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
24ce0 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
24cf0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
24d00 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
24d10 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
24d20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c  is routine handl
24d30 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  es sqlite3_file_
24d40 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20  control() calls 
24d50 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69  that are specifi
24d60 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f  c.** to proxy lo
24d70 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
24d80 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
24d90 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
24da0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
24db0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
24dc0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
24dd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
24de0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
24df0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
24e00 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
24e10 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
24e20 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
24e30 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
24e40 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
24e50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
24e60 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
24e70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
24e80 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
24e90 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
24ea0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
24eb0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
24ec0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
24ed0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
24ee0 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
24ef0 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78  r **)pArg = pCtx
24f00 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
24f10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24f20 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
24f30 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
24f40 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65   ":auto: (not he
24f50 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ld)";.        }.
24f60 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
24f70 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
24f80 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55  har **)pArg = NU
24f90 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
24fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24fb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
24fc0 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
24fd0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
24fe0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
24ff0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
25000 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  *)id;.      int 
25010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25020 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78        int isProx
25030 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d  yStyle = (pFile-
25040 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
25050 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20  xyIoMethods);.  
25060 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
25070 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61  LL || (const cha
25080 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20  r *)pArg==0 ){. 
25090 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
250a0 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
250b0 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
250c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
250d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a   not supported *
250e0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
250f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a   SQLITE_ERROR /*
25100 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f  SQLITE_PROTOCOL?
25110 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a   SQLITE_MISUSE?*
25120 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  /;.        }else
25130 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
25140 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
25150 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20  cking - already 
25160 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20  off - NOOP */.  
25170 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25180 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
25190 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
251a0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
251b0 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28  r *proxyPath = (
251c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
251d0 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  g;.        if( i
251e0 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20  sProxyStyle ){. 
251f0 20 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f           proxyLo
25200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
25210 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  tx = .          
25220 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43    (proxyLockingC
25230 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
25240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
25250 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74           if( !st
25260 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74  rcmp(pArg, ":aut
25270 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20  o:") .          
25280 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50   || (pCtx->lockP
25290 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20  roxyPath &&.    
252a0 20 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e             !strn
252b0 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
252c0 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61  oxyPath, proxyPa
252d0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
252e0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
252f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
25310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25320 20 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74         rc = swit
25330 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28  chLockProxyPath(
25340 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68  pFile, proxyPath
25350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25370 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
25380 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  on proxy file lo
25390 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
253a0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
253b0 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70  nsformUnixFile(p
253c0 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
253d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
253e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
253f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
25400 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
25410 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a  assert( 0 );  /*
25420 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65   The call assure
25430 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69  s that only vali
25440 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65  d opcodes are se
25450 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt */.    }.  }.
25460 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
25470 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25480 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
25490 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76   Within this div
254a0 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79  ision (the proxy
254b0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ing locking impl
254c0 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20  ementation) the 
254d0 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62  procedures.** ab
254e0 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61  ove this point a
254f0 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73  re all utilities
25500 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61  .  The lock-rela
25510 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  ted methods of t
25520 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b  he.** proxy-lock
25530 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ing sqlite3_io_m
25540 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c  ethod object fol
25550 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  low..*/.../*.** 
25560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
25570 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
25580 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
25590 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
255a0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
255b0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
255c0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
255d0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
255e0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
255f0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
25600 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
25610 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
25620 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
25630 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
25640 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
25650 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
25660 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
25670 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
25680 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
25690 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
256a0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
256b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
256c0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e  *pResOut) {.  un
256d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
256e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
256f0 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
25700 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
25710 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
25730 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
25740 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
25750 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
25760 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
25770 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
25780 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
25790 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
257a0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
257b0 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
257c0 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
257d0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
257e0 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 7d 0a 20   pResOut);.  }. 
257f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25800 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
25810 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
25820 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
25830 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
25840 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
25850 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
25860 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
25870 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
25880 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
25890 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
258a0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
258b0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
258c0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
258d0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
258e0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
258f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
25900 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
25910 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
25920 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
25930 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
25940 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
25950 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
25960 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
25970 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
25980 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
25990 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
259a0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
259b0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
259c0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
259d0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
259e0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
259f0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
25a00 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
25a10 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
25a20 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
25a30 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
25a40 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
25a50 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
25a60 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
25a70 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
25a80 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
25a90 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
25aa0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
25ab0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
25ac0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
25ad0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
25ae0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
25af0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
25b00 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
25b10 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
25b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
25b30 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
25b40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
25b50 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
25b60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
25b70 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
25b80 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
25b90 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
25ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25bb0 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
25bc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
25bd0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
25be0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
25bf0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
25c00 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  t;.    unixFile 
25c10 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
25c20 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63  ockProxy;.    rc
25c30 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
25c40 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
25c50 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c  3_file*)proxy, l
25c60 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46  ocktype);.    pF
25c70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
25c80 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b  proxy->locktype;
25c90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25ca0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
25cb0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
25cc0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
25cd0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
25ce0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
25cf0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
25d00 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
25d10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
25d20 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
25d30 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
25d40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
25d50 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
25d60 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
25d70 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
25d80 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
25d90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
25da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
25db0 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
25dc0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
25dd0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
25de0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
25df0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
25e00 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
25e10 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
25e20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
25e40 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
25e50 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
25e60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
25e70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
25e80 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
25e90 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
25ea0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
25eb0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
25ec0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
25ed0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
25ee0 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
25ef0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
25f00 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b  pe = proxy->lock
25f10 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  type;.  }.  retu
25f20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25f30 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61  Close a file tha
25f40 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63  t uses proxy loc
25f50 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
25f60 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
25f70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
25f80 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
25f90 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
25fa0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
25fb0 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ;.    proxyLocki
25fc0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
25fd0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
25fe0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
25ff0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
26000 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
26010 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
26020 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75  lockProxy;.    u
26030 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
26040 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
26050 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63  File;.    int rc
26060 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26070 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50    .    if( lockP
26080 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
26090 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
260a0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
260b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
260c0 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b  ckProxy, NO_LOCK
260d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
260e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
260f0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
26100 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
26110 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
26120 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
26130 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
26140 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
26150 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
26160 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74  roxy);.      pCt
26170 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30  x->lockProxy = 0
26180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26190 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20  conchFile ){.   
261a0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
261b0 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  chHeld ){.      
261c0 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65    rc = proxyRele
261d0 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  aseConch(pFile);
261e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
261f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26200 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
26210 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
26220 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
26230 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
26240 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
26250 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
26260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26270 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  ee(conchFile);. 
26280 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26290 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b  _free(pCtx->lock
262a0 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  ProxyPath);.    
262b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
262c0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
262d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
262e0 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ree(pCtx->dbPath
262f0 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72  );.    /* restor
26300 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  e the original l
26310 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
26320 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
26330 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  close it */.    
26340 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
26350 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c  ntext = pCtx->ol
26360 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
26370 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  .    pFile->pMet
26380 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64  hod = pCtx->pOld
26390 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69  Method;.    sqli
263a0 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
263b0 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
263c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
263d0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
263e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
263f0 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ....#endif /* de
26400 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
26410 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
26420 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
26430 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
26440 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
26450 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
26460 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
26470 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
26480 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
26490 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
264a0 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
264b0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
264c0 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
264d0 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
264e0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
264f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
26500 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
26510 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
26520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26530 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
26540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26580 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
26590 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
265a0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
265b0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
265c0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
265d0 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
265e0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
265f0 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
26600 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
26610 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
26620 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
26630 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
26640 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
26650 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
26660 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
26670 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
26680 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
26690 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
266a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
266b0 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
266c0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
266d0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
266e0 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
266f0 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
26700 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
26710 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
26720 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
26730 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
26740 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
26750 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
26760 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
26770 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
26780 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
26790 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
267a0 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
267b0 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
267c0 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
267d0 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
267e0 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
267f0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
26800 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
26810 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
26820 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
26830 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
26840 22 66 69 6e 64 65 72 22 0a 20 20 2a 2a 20 66 75  "finder".  ** fu
26850 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 46 49 4e  nction.  The FIN
26860 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f  DER parameter to
26870 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74   this macro is t
26880 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20  he name of the. 
26890 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
268a0 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
268b0 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
268c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
268d0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
268e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
268f0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
26900 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
26910 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
26920 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
26930 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
26940 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
26950 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
26960 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
26970 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
26980 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
26990 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
269a0 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
269b0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
269c0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
269d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
269e0 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
269f0 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
26a00 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
26a10 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
26a20 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
26a30 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
26a40 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
26a50 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
26a60 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
26a70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
26a80 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
26a90 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
26aa0 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
26ab0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
26ac0 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
26ad0 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
26ae0 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
26af0 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b50 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
26b60 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
26b70 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
26ba0 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
26bb0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26bd0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
26be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
26bf0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
26c00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26c10 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
26c20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
26c30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26c40 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
26c50 28 76 6f 69 64 2a 29 46 49 4e 44 45 52 2c 20 20  (void*)FINDER,  
26c60 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
26c70 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
26c80 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
26c90 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
26ca0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
26cd0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
26ce0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
26d10 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
26d20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
26d50 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
26d60 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
26d70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
26d80 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
26d90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
26da0 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26dc0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
26dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
26de0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
26df0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26e00 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
26e10 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
26e20 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
26e30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
26e40 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
26e50 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
26e60 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
26e70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
26e80 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
26e90 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
26ea0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
26eb0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
26ec0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
26ed0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
26f00 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
26f10 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
26f20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
26f30 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
26f40 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a  astError      /*
26f50 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
26f60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
26f70 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
26f80 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
26f90 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
26fa0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
26fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
26fc0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
26fd0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
26fe0 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
26ff0 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
27000 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
27010 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
27020 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
27030 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
27040 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
27050 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
27060 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
27070 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
27080 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
27090 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
270a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
270b0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
270c0 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20  d(__DARWIN__).  
270d0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
270e0 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c  ,          autol
270f0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
27100 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53  else.    UNIXVFS
27110 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
27120 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
27130 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e  ),.#endif.    UN
27140 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65  IXVFS("unix-none
27150 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ",     nolockIoF
27160 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
27170 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69  XVFS("unix-dotfi
27180 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  le",  dotlockIoF
27190 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f  inder ),.#if OS_
271a0 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
271b0 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73  VFS("unix-nameds
271c0 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72  em", semIoFinder
271d0 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   ),.#endif.#if S
271e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
271f0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55  KING_STYLE.    U
27200 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73  NIXVFS("unix-pos
27210 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46  ix",    posixIoF
27220 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
27230 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
27240 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  ",    flockIoFin
27250 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69  der ),.#endif.#i
27260 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27270 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
27280 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
27290 4e 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  N__).    UNIXVFS
272a0 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20  ("unix-afp",    
272b0 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c    afpIoFinder ),
272c0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
272d0 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
272e0 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
272f0 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
27300 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
27310 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27320 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52  unter */..  /* R
27330 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
27340 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
27350 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
27360 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
27370 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
27380 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
27390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
273a0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
273b0 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
273c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
273d0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
273e0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
273f0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
27400 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
27410 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
27420 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
27430 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
27440 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
27450 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
27460 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
27470 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
27480 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
27490 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
274a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
274b0 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
274c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
274d0 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
274e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
274f0 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
27500 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.