/ Hex Artifact Content
Login

Artifact 8f6ffa95c8dc79b94565b517bc37abb426f09a23:


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 34 33 20 32 30 30 39 2f 30  c,v 1.243 2009/0
0810: 33 2f 32 31 20 31 34 3a 34 31 3a 30 34 20 64 72  3/21 14:41:04 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 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b00: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0b10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0b20: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0b30: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0b40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0b50: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0b60: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0b70: 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f  .** Define the O
0b80: 53 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72  S_VXWORKS pre-pr
0b90: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f  ocessor macro to
0ba0: 20 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f   1 if building o
0bb0: 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f  n .** vxworks, o
0bc0: 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  r 0 otherwise..*
0bd0: 2f 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57  /.#ifndef OS_VXW
0be0: 4f 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e  ORKS.#  if defin
0bf0: 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64  ed(__RTP__) || d
0c00: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
0c10: 45 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  EL).#    define 
0c20: 4f 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20  OS_VXWORKS 1.#  
0c30: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
0c40: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20   OS_VXWORKS 0.# 
0c50: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0c60: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0c70: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0c80: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0c90: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0ca0: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0cb0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0cc0: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0cd0: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
0ce0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
0cf0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
0d00: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
0d10: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
0d20: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
0d30: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0d40: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0d50: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0d60: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0d70: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0d80: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0d90: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0da0: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0db0: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0dc0: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0dd0: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
0de0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
0df0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
0e00: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
0e10: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
0e20: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
0e30: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0e40: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0e50: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0e60: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0e70: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0e80: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0e90: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0ea0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0eb0: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0ec0: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0ed0: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
0ee0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a  d omit LFS..**.*
0ef0: 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70  * The previous p
0f00: 61 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69  aragraph was wri
0f10: 74 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28  tten in 2005.  (
0f20: 54 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69  This paragraph i
0f30: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20  s written.** on 
0f40: 32 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65  2008-11-28.) The
0f50: 73 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e  se days, all Lin
0f60: 75 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f  ux kernels suppo
0f70: 72 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20  rt large files, 
0f80: 73 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64  so.** you should
0f90: 20 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20   probably leave 
0fa0: 4c 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75  LFS enabled.  Bu
0fb0: 74 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20  t some embedded 
0fc0: 70 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a  platforms might.
0fd0: 2a 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77  ** lack LFS in w
0fe0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51  hich case the SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 20 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69   macro might sti
1010: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f  ll be useful..*/
1020: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1030: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65  DISABLE_LFS.# de
1040: 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45  fine _LARGE_FILE
1050: 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65         1.# ifnde
1060: 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  f _FILE_OFFSET_B
1070: 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f  ITS.#   define _
1080: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
1090: 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65   64.# endif.# de
10a0: 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f  fine _LARGEFILE_
10b0: 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a  SOURCE 1.#endif.
10c0: 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  ./*.** standard 
10d0: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a  include files..*
10e0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  /.#include <sys/
10f0: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
1100: 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23  e <sys/stat.h>.#
1110: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
1120: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  >.#include <unis
1130: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  td.h>.#include <
1140: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
1150: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69   <sys/time.h>.#i
1160: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
1170: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1180: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1190: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  E.# include <sys
11a0: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 66 20 4f  /ioctl.h>.# if O
11b0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e 63  S_VXWORKS.#  inc
11c0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
11d0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c  h>.#  include <l
11e0: 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65 0a  imits.h>.# else.
11f0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
1200: 66 69 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  file.h>.#  inclu
1210: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
1220: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
1230: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 20 65 6e 64 69  /mount.h>.# endi
1240: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
1250: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1260: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
1270: 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62  * If we are to b
1280: 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69  e thread-safe, i
1290: 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65  nclude the pthre
12a0: 61 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64  ads header and d
12b0: 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c  efine.** the SQL
12c0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
12d0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
12e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12f0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  .# include <pthr
1300: 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20  ead.h>.# define 
1310: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
1320: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ADS 1.#endif../*
1330: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
1340: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
1350: 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  ating a new file
1360: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1370: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
1380: 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65  PERMISSIONS.# de
1390: 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41  fine SQLITE_DEFA
13a0: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
13b0: 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66  IONS 0644.#endif
13c0: 0a 0a 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74  ../*. ** Default
13d0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
13e0: 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20  n creating auto 
13f0: 70 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69  proxy dir. */.#i
1400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1410: 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
1420: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1430: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1440: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1450: 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64  SSIONS 0755.#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
1470: 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68  m supported path
1480: 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66  -length..*/.#def
1490: 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ine MAX_PATHNAME
14a0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79   512../*.** Only
14b0: 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72   set the lastErr
14c0: 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  no if the error 
14d0: 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65  code is a real e
14e0: 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a  rror and not .**
14f0: 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74   a normal expect
1500: 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f  ed return code o
1510: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  f SQLITE_BUSY or
1520: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64   SQLITE_OK.*/.#d
1530: 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52  efine IS_LOCK_ER
1540: 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53  ROR(x)  ((x != S
1550: 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20  QLITE_OK) && (x 
1560: 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29  != SQLITE_BUSY))
1570: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  .../*.** The uni
1580: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1590: 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73  is subclass of s
15a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63  qlite3_file spec
15b0: 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78  ific to the unix
15c0: 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  .** VFS implemen
15d0: 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65  tations..*/.type
15e0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
15f0: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
1600: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
1610: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
1620: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
1630: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
1640: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1650: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1660: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  OpenCnt *pOpen; 
1670: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
1680: 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27  out all open fd'
1690: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
16a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
16b0: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
16c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
16d0: 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69  out locks on thi
16e0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
16f0: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1710: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
1720: 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ptor */.  int di
1730: 72 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  rfd;            
1740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1750: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
1760: 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  r the directory 
1770: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1780: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  ar locktype;    
1790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
17a0: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
17b0: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 69  n this fd */.  i
17c0: 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  nt lastErrno;   
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
17f0: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1800: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1810: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1820: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1830: 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  /* Locking style
1840: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20   specific state 
1850: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1860: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1870: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1880: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1890: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61        /* The fla
18a0: 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74 20  gs specified at 
18b0: 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66  open() */.#endif
18c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
18d0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
18e0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70  d(__linux__).  p
18f0: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
1920: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75  at "owns" this u
1930: 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  nixFile */.#endi
1940: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1950: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1980: 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1990: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
19a0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
19b0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
19c0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
19d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19e0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
19f0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1a00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1a10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1a20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1a30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1a40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1a50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1a60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1a70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1a80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1a90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1aa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1ab0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1ac0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1ad0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ae0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1af0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1b00: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
1b10: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
1b20: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
1b30: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
1b40: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
1b50: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
1b60: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
1b70: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
1b80: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
1b90: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
1ba0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
1bb0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
1bc0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
1bd0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
1be0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
1bf0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
1c00: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
1c10: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
1c20: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
1c30: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
1c40: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
1c50: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  on */..  /* If t
1c60: 72 75 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  rue, that means 
1c70: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1c80: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 66  ith a database f
1c90: 69 6c 65 20 74 68 61 74 20 68 61 73 0a 20 20 2a  ile that has.  *
1ca0: 2a 20 61 20 72 61 6e 67 65 20 6f 66 20 6c 6f 63  * a range of loc
1cb0: 6b 69 6e 67 20 62 79 74 65 73 20 66 72 6f 6d 20  king bytes from 
1cc0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 74 68 72  PENDING_BYTE thr
1cd0: 6f 75 67 68 20 50 45 4e 44 49 4e 47 5f 42 59 54  ough PENDING_BYT
1ce0: 45 2b 35 31 31 0a 20 20 2a 2a 20 77 68 69 63 68  E+511.  ** which
1cf0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
1d00: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d10: 2e 20 20 41 73 73 65 72 74 73 28 29 20 77 69 6c  .  Asserts() wil
1d20: 6c 20 76 65 72 69 66 79 20 74 68 69 73 20 2a 2f  l verify this */
1d30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1d40: 20 69 73 4c 6f 63 6b 61 62 6c 65 3b 20 20 20 20   isLockable;    
1d50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69 6c    /* True if fil
1d60: 65 20 6d 69 67 68 74 20 62 65 20 6c 6f 63 6b 65  e might be locke
1d70: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  d */.#endif.#ifd
1d80: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d90: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
1da0: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
1db0: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
1dc0: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
1dd0: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
1de0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1df0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
1e00: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
1e10: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
1e20: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
1e30: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1e40: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
1e50: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
1e60: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
1e70: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
1e80: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
1e90: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
1ea0: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
1eb0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
1ec0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
1ed0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
1ee0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
1ef0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
1f00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
1f10: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
1f20: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
1f30: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
1f40: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
1f50: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
1f60: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
1f70: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
1f80: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
1f90: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
1fa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1fb0: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
1fc0: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
1fd0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
1fe0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
1ff0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
2000: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
2010: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
2020: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
2030: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
2040: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
2050: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
2060: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
2070: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
2080: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
2090: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
20a0: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
20b0: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23  fdef __DJGPP__.#
20c0: 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c   define fcntl(A,
20d0: 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  B,C) 0.#endif../
20e0: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
20f0: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2100: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2110: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
2120: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2130: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2140: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
2150: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
2160: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
2170: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2180: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2190: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  did 0.#endif.../
21a0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
21b0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
21c0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
21d0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
21e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21f0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
2200: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
2210: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
2220: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
2230: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
2240: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
2250: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
2260: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
2270: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2280: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
2290: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
22a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
22b0: 45 52 29 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ER));.}...#ifdef
22c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
22d0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
22e0: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
22f0: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
2300: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
2310: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
2320: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
2330: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
2340: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
2350: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
2360: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
2370: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2380: 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d  har *locktypeNam
2390: 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  e(int locktype){
23a0: 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74  .  switch( lockt
23b0: 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f  ype ){.  case NO
23c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
23d0: 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41  ONE";.  case SHA
23e0: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
23f0: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73   "SHARED";.  cas
2400: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
2410: 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45   return "RESERVE
2420: 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49  D";.  case PENDI
2430: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
2440: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73  "PENDING";.  cas
2450: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
2460: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
2470: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
2480: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
2490: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
24a0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
24b0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
24c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
24d0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
24e0: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
24f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2500: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
2510: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
2520: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
2530: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
2540: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
2550: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
2560: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
2570: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
2580: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
2590: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
25a0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
25b0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
25c0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
25d0: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
25e0: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
25f0: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
2600: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
2610: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
2620: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
2630: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
2640: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
2650: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
2660: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
2670: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
2680: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
2690: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
26a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
26b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
26d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
26e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
26f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
2700: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
2710: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
2720: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2730: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
2740: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
2750: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
2760: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
2770: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
2780: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2790: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
27a0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
27b0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
27c0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
27d0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
27e0: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
27f0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
2800: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
2810: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2820: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
2830: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
2840: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
2850: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
2860: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
2870: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
2880: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
2890: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
28a0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
28b0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
28c0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
28d0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
28e0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
28f0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
2900: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
2910: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
2920: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
2930: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
2940: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
2950: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
2960: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
2970: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
2980: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2990: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
29a0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
29b0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
29c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
29d0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
29e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
29f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
2a00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a10: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
2a20: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
2a30: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
2a40: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
2a50: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
2a60: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
2a70: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
2a80: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
2a90: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
2aa0: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
2ab0: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
2ac0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2ad0: 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  E */..../*.** Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
2af0: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
2b00: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
2b10: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
2b20: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
2b30: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
2b40: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
2b50: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
2b60: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
2b70: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
2b80: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
2b90: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
2ba0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
2bb0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
2bc0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
2bd0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
2be0: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
2bf0: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
2c00: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
2c10: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
2c20: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2c30: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
2c40: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
2c50: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
2c60: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
2c70: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
2c80: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
2c90: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
2ca0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
2cb0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
2cc0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
2cd0: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
2ce0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
2cf0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a  ror) {.  case 0:
2d00: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
2d10: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63  ITE_OK;.    .  c
2d20: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
2d30: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
2d40: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
2d50: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
2d60: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
2d70: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
2d80: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
2d90: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
2da0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
2db0: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
2dc0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
2dd0: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
2de0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
2df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e00: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
2e10: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
2e20: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
2e30: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
2e40: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
2e50: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
2e60: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
2e70: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
2e80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2e90: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  _LOCK) || ..(sql
2ea0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
2eb0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
2ec0: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
2ed0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
2ee0: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28  RR_RDLOCK) ||..(
2ef0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
2f00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
2f10: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
2f20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f30: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2f40: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
2f50: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
2f60: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
2f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2f80: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  ERM;.    .  case
2f90: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
2fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2fb0: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a  R_BLOCKED;.    .
2fc0: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
2fd0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
2fe0: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
2ff0: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
3000: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
3010: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
3020: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
3030: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
3040: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
3050: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
3060: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
3070: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
3080: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
3090: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
30a0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
30b0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
30c0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
30d0: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
30e0: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
30f0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3100: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3110: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
3120: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
3130: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
3140: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
3150: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
3160: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
3170: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
3180: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20    case ESTALE:. 
3190: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
31a0: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
31b0: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
31c0: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
31d0: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
31e0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
31f0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
3200: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
3210: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
3220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3260: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
3270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
3280: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
3290: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
32a0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
32b0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
32c0: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
32d0: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
32e0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
32f0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
3300: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
3310: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
3320: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
3330: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
3340: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
3350: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
3360: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
3370: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
3380: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
3390: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
33a0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
33b0: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
33c0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
33d0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
33e0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
33f0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3400: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
3410: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
3420: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
3430: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
3440: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
3450: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
3460: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
3470: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
3480: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
3490: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
34a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
34b0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
34c0: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
34d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
34e0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
34f0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
3500: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
3510: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
3520: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
3530: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
3540: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
3550: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
3560: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
3570: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
3580: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3590: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
35a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
35b0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
35c0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
35d0: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
35e0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
35f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3600: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
3610: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
3620: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3640: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
3650: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
3660: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
3670: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
3680: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
3690: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
36a0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
36b0: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
36c0: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
36d0: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
36e0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
36f0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
3700: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
3710: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
3720: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
3730: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
3740: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
3750: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
3760: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
3770: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
3780: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
3790: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
37a0: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
37b0: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
37c0: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
37d0: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
37e0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
37f0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
3800: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
3810: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
3820: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
3830: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
3840: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
3850: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
3860: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
3870: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
3880: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
3890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
38a0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
38b0: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
38c0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
38d0: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
38e0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
38f0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
3900: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
3910: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
3920: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
3930: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
3940: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
3950: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
3960: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
3970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
3980: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
3990: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
39a0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
39b0: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
39c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
39d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
39e0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
39f0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
3a00: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
3a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
3a20: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
3a30: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
3a40: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
3a50: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
3a60: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
3a70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
3a90: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
3aa0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
3ab0: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
3ac0: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
3ad0: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
3ae0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
3af0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
3b00: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3b10: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
3b20: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
3b30: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
3b40: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
3b50: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
3b60: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
3b70: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
3b80: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
3b90: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
3ba0: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
3bb0: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
3bc0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
3bd0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
3be0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
3bf0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
3c00: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
3c10: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
3c20: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
3c30: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
3c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
3c50: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
3c60: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
3c70: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
3c80: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
3c90: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
3ca0: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
3cb0: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
3cc0: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
3cd0: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
3ce0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
3cf0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
3d00: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
3d10: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
3d20: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3d50: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
3d60: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
3d70: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
3d80: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
3d90: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
3da0: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
3db0: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
3dc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
3dd0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
3de0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
3df0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3e00: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
3e10: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
3e20: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
3e30: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
3e40: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
3e50: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
3e60: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
3e70: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
3e80: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3e90: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
3ea0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
3eb0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
3ec0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
3ed0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
3ee0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
3ef0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
3f00: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
3f10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
3f20: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
3f30: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
3f40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
3f50: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
3f60: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
3f70: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
3f80: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
3f90: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
3fa0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
3fb0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
3fc0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
3fd0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
3fe0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
3ff0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
4000: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
4010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4020: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
4030: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
4040: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
4050: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
4060: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
4070: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
4080: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
4090: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
40a0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
40b0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
40c0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
40d0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
40e0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
40f0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
4100: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
4110: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
4120: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
4130: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4140: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
4150: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4160: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
4170: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
4180: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
4190: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
41a0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
41b0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
41c0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
41d0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
41e0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
41f0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
4200: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
4210: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
4220: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
4230: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
4240: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
4250: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4260: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
4270: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
4280: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
4290: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
42a0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
42b0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
42c0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
42d0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
42e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
42f0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
4300: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
4310: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
4320: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
4330: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
4340: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
4350: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
4360: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
4370: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43c0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
43d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4410: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
4440: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
4450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4460: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
4470: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
4480: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
4490: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
44a0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
44b0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
44c0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
44d0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
44e0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
44f0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
4500: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
4510: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
4520: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
4530: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4550: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
4560: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
4570: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
4580: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
4590: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
45a0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
45b0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
45c0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
45d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
45e0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
45f0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
4600: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
4610: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
4620: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
4630: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
4640: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
4650: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
4660: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
4670: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
4680: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
4690: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
46a0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
46b0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
46c0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
46d0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
46e0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
46f0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
4700: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
4710: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
4720: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
4730: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
4740: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
4750: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
4760: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
4770: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
4780: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
4790: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
47a0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
47b0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
47c0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
47d0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
47e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
47f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
4800: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
4810: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
4820: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
4830: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
4840: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
4850: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
4860: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
4870: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
4880: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
4890: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
48a0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
48b0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
48c0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
48d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
48e0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
48f0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
4900: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
4910: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
4920: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
4930: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
4940: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
4950: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
4960: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
4970: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
4980: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
4990: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
49a0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
49b0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
49c0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
49d0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
49e0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
49f0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
4a00: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
4a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4a20: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
4a30: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
4a40: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
4a50: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
4a60: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
4a70: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
4a80: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
4a90: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
4aa0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
4ab0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
4ac0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
4ad0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
4ae0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
4af0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
4b00: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
4b10: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
4b20: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
4b30: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
4b40: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
4b50: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
4b60: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
4b70: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
4b80: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
4b90: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
4ba0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
4bb0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
4bc0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
4bd0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
4be0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
4bf0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
4c00: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
4c10: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
4c20: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
4c30: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
4c40: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
4c50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
4c60: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
4c70: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
4c80: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
4c90: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
4ca0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
4cb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
4cc0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
4cd0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
4ce0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
4cf0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
4d00: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
4d10: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
4d20: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
4d30: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
4d40: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
4d50: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
4d60: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
4d70: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
4d80: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
4d90: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
4da0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
4db0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
4dc0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
4dd0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
4de0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
4df0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
4e00: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
4e10: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
4e20: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
4e30: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
4e40: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
4e50: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
4e60: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
4e70: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
4e80: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
4e90: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
4ea0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
4eb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
4ec0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
4ed0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
4ee0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
4ef0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
4f00: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
4f10: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
4f20: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
4f30: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
4f40: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
4f50: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
4f60: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
4f70: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
4f80: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
4f90: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
4fa0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
4fb0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
4fc0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
4fd0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
4fe0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
4ff0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
5000: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
5010: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
5020: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
5030: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
5040: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
5050: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
5060: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
5070: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
5080: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
5090: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
50a0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
50b0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
50c0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
50d0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
50e0: 2c 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20  , each unixFile 
50f0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
5100: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
5110: 74 6f 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e  to an unixOpenCn
5120: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
5130: 65 72 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f  ere is one unixO
5140: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
5150: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
5160: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
5170: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e  that multiple un
5180: 69 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74  ixFile can point
5190: 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   to a single.** 
51a0: 75 6e 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68  unixOpenCnt.  Wh
51b0: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
51c0: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
51d0: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
51e0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
51f0: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
5200: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
5210: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
5220: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
5230: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
5240: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5250: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
5260: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
5270: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
5280: 2a 20 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  * The unixOpenCn
5290: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
52a0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
52b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
52c0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
52d0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
52e0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
52f0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
5300: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
5310: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
5320: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
5330: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5340: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5350: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5360: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5370: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5380: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5390: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
53a0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
53b0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
53c0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
53d0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
53e0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
53f0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
5400: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
5410: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
5420: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
5430: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5440: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5450: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5460: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5470: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5480: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5490: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
54a0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
54b0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
54c0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
54d0: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
54e0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
54f0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5500: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5510: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5520: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5530: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5540: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5550: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5560: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5570: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5580: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5590: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
55a0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
55b0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
55c0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
55d0: 42 2e 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f  B..** We have to
55e0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
55f0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5600: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5610: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5620: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f  process..**.** O
5630: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
5640: 74 68 72 65 61 64 20 41 20 69 73 20 75 6e 61 62  thread A is unab
5650: 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63  le to modify loc
5660: 6b 73 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a  ks created by.**
5670: 20 74 68 72 65 61 64 20 42 2c 20 77 65 20 68 61   thread B, we ha
5680: 76 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b  ve to keep track
5690: 20 6f 66 20 77 68 69 63 68 20 74 68 72 65 61 64   of which thread
56a0: 20 63 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a   created each.**
56b0: 20 6c 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68   lock.  Hence th
56c0: 65 72 65 20 69 73 20 61 6e 20 65 78 74 72 61 20  ere is an extra 
56d0: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79  field in the key
56e0: 20 74 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b   to the unixLock
56f0: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
5700: 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73  e to record this
5710: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41   information.  A
5720: 6e 64 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74  nd on those syst
5730: 65 6d 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c  ems it.** is ill
5740: 65 67 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20  egal to begin a 
5750: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f  transaction in o
5760: 6e 65 20 74 68 72 65 61 64 20 61 6e 64 20 66 69  ne thread and fi
5770: 6e 69 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e  nish it.** in an
5780: 6f 74 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73  other.  For this
5790: 20 6c 61 74 74 65 72 20 72 65 73 74 72 69 63 74   latter restrict
57a0: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ion, there is no
57b0: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a   work-around..**
57c0: 20 49 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74   It is a limitat
57d0: 69 6f 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65  ion of LinuxThre
57e0: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ads..*/../*.** S
57f0: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
5800: 75 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65  unixFile.tid fie
5810: 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20  ld.  This field 
5820: 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75  is set when an u
5830: 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69  nixFile.** is fi
5840: 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c  rst opened.  All
5850: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
5860: 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
5870: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
5880: 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20  .** same thread 
5890: 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  is operating on 
58a0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53  the unixFile.  S
58b0: 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
58c0: 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20  stems do.** not 
58d0: 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62  allow locks to b
58e0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
58f0: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e  other threads an
5900: 64 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69  d that restricti
5910: 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  on.** means that
5920: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
5930: 73 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f  se handles canno
5940: 74 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20  t be moved from 
5950: 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f  one thread.** to
5960: 20 61 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c   another while l
5970: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a  ocks are held..*
5980: 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33  *.** Version 3.3
5990: 2e 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a  .1 (2006-01-15):
59a0: 20 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62    unixFile can b
59b0: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65  e moved from one
59c0: 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e   thread to.** an
59d0: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
59e0: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
59f0: 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61 74  on a system that
5a00: 20 73 75 70 70 6f 72 74 73 20 74 68 72 65 61 64   supports thread
5a10: 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20  s.** overriding 
5a20: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
5a30: 73 20 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20  s (which is now 
5a40: 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20  the most common 
5a50: 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20  behavior).** or 
5a60: 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  if no locks are 
5a70: 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75  held.  But the u
5a80: 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69  nixFile.pLock fi
5a90: 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  eld needs to be.
5aa0: 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65  ** recomputed be
5ab0: 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e  cause its key in
5ac0: 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61  cludes the threa
5ad0: 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a  d-id.  See the .
5ae0: 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ** transferOwner
5af0: 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  ship() function 
5b00: 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
5b10: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5b20: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
5b30: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
5b40: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
5b50: 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52  # define SET_THR
5b60: 45 41 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e  EADID(X)   (X)->
5b70: 74 69 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65  tid = pthread_se
5b80: 6c 66 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48  lf().# define CH
5b90: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
5ba0: 28 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65  (threadsOverride
5bb0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d  EachOthersLocks=
5bc0: 3d 30 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  =0 && \.        
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 21 70 74 68 72 65 61 64 5f 65 71 75      !pthread_equ
5bf0: 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68  al((X)->tid, pth
5c00: 72 65 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65  read_self())).#e
5c10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54  lse.# define SET
5c20: 5f 54 48 52 45 41 44 49 44 28 58 29 0a 23 20 64  _THREADID(X).# d
5c30: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
5c40: 41 44 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66  ADID(X) 0.#endif
5c50: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
5c60: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
5c70: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
5c80: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
5c90: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
5ca0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
5cb0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
5cc0: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
5cd0: 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20  inode.  This.** 
5ce0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
5cf0: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65  he unixLockKey e
5d00: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
5d10: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
5d20: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ted..*/.struct u
5d30: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
5d40: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
5d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
5d60: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
5d70: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
5d80: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5d90: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
5da0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
5db0: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
5dc0: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
5df0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
5e00: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
5e10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5e20: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
5e30: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
5e40: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
5e50: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
5e60: 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74  xLockInfo struct
5e70: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
5e80: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
5e90: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
5ea0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
5eb0: 73 20 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68  s locks (LinuxTh
5ec0: 72 65 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a  reads), then we.
5ed0: 2a 2a 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c  ** set the unixL
5ee0: 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64  ockKey.tid field
5ef0: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49   to the thread I
5f00: 44 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63  D.  If threads c
5f10: 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65  an override.** e
5f20: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
5f30: 20 28 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c   (Posix and NPTL
5f40: 29 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c  ) then tid is al
5f50: 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
5f60: 2e 0a 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74  ..** tid is omit
5f70: 74 65 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c  ted if we compil
5f80: 65 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64  e without thread
5f90: 69 6e 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f  ing support or o
5fa0: 6e 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72  n an OS.** other
5fb0: 20 74 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a   than linux..*/.
5fc0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b  struct unixLockK
5fd0: 65 79 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  ey {.  struct un
5fe0: 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f  ixFileId fid;  /
5ff0: 2a 20 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66  * Unique identif
6000: 69 65 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ier for the file
6010: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54   */.#if SQLITE_T
6020: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
6030: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
6040: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
6050: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
6060: 66 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65  f lock owner. Ze
6070: 72 6f 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20  ro if not using 
6080: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a  LinuxThreads */.
6090: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
60a0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
60b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
60c0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
60d0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
60e0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
60f0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
6100: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
6110: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
6120: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
6130: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
6140: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
6150: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
6160: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
6170: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
6180: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
6190: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
61a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
61b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
61c0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
61d0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
61e0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
61f0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
6200: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
6210: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6220: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  */.struct unixLo
6230: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
6240: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f  t unixLockKey lo
6250: 63 6b 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68  ckKey;     /* Th
6260: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
6270: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
62a0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
62b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79   */.  int lockty
62c0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
62d0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
62e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
62f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
6300: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6330: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6340: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6350: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
6360: 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  kInfo *pNext;   
6370: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
6380: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62   unixLockInfo ob
6390: 6a 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  jects */.  struc
63a0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
63b0: 70 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20  pPrev;     /*   
63c0: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
63d0: 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ked */.};../*.**
63e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
63f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
6400: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
6410: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
6420: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
6430: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
6440: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
6450: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
6460: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
6470: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
6480: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
6490: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
64a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
64b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
64c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
64d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
64e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
64f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6500: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
6510: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
6520: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ist..**.** TODO:
6530: 20 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67    Consider chang
6540: 69 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61 74  ing this so that
6550: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
6560: 20 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20   single file.** 
6570: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65  descriptor for e
6580: 61 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65  ach open file, e
6590: 76 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f  ven when it is o
65a0: 70 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  pened multiple t
65b0: 69 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f  imes..** The clo
65c0: 73 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  se() system call
65d0: 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75   would only occu
65e0: 72 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  r when the last 
65f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e  database.** usin
6600: 67 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65  g the file close
6610: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
6620: 78 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72  xOpenCnt {.  str
6630: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
6640: 69 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20  ileId;   /* The 
6650: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
6660: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6680: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6690: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
66a0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ure */.  int nLo
66b0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
66c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
66d0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
66e0: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
66f0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20  nding;          
6700: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6710: 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28  f pending close(
6720: 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  ) operations */.
6730: 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b    int *aPending;
6740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6750: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f  alloced space ho
6760: 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61 69 74  lding fd's await
6770: 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f  ing a close() */
6780: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6790: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
67c0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
67d0: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
67e0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
67f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
6800: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
6810: 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 75  endif.  struct u
6820: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4e 65 78  nixOpenCnt *pNex
6830: 74 2c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  t, *pPrev;   /* 
6840: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
6850: 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 20  OpenCnt objects 
6860: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73  */.};../*.** Lis
6870: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f  ts of all unixLo
6880: 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f  ckInfo and unixO
6890: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 2e 20  penCnt objects. 
68a0: 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 20 62   These used to b
68b0: 65 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65 73  e hash.** tables
68c0: 2e 20 20 42 75 74 20 74 68 65 20 6e 75 6d 62 65  .  But the numbe
68d0: 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 69 73 20  r of objects is 
68e0: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
68f0: 20 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20   a dozen and.** 
6900: 6e 65 76 65 72 20 65 78 63 65 65 64 73 20 61 20  never exceeds a 
6910: 66 65 77 20 74 68 6f 75 73 61 6e 64 2e 20 20 41  few thousand.  A
6920: 6e 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f 74  nd lookup is not
6930: 20 6f 6e 20 61 20 63 72 69 74 69 63 61 6c 0a 2a   on a critical.*
6940: 2a 20 70 61 74 68 20 73 6f 20 61 20 73 69 6d 70  * path so a simp
6950: 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77  le linked list w
6960: 69 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a 2f 0a  ill suffice..*/.
6970: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e  static struct un
6980: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b  ixLockInfo *lock
6990: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
69a0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
69b0: 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20  Cnt *openList = 
69c0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  0;../*.** This v
69d0: 61 72 69 61 62 6c 65 20 72 65 6d 65 6d 62 65 72  ariable remember
69e0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
69f0: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
6a00: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6a10: 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  s.** locks..**.*
6a20: 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68  *    0:  No.  Th
6a30: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
6a40: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6a50: 73 20 6c 6f 63 6b 73 2e 20 20 28 4c 69 6e 75 78  s locks.  (Linux
6a60: 54 68 72 65 61 64 73 29 0a 2a 2a 20 20 20 20 31  Threads).**    1
6a70: 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73  :  Yes.  Threads
6a80: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6a90: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6aa0: 20 20 28 50 6f 73 69 78 20 26 20 4e 4c 50 54 29    (Posix & NLPT)
6ab0: 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f  .**   -1:  We do
6ac0: 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a  n't know yet..**
6ad0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  .** On some syst
6ae0: 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20  ems, we know at 
6af0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20  compile-time if 
6b00: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
6b10: 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68  ride each.** oth
6b20: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74  ers locks.  On t
6b30: 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68  hose systems, th
6b40: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
6b50: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61  OVERRIDE_LOCK ma
6b60: 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  cro.** will be s
6b70: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
6b80: 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74  .  On other syst
6b90: 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ems, we have to 
6ba0: 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74  check at.** runt
6bb0: 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c  ime.  On these l
6bc0: 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53  atter systems, S
6bd0: 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLTIE_THREAD_OVE
6be0: 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a  RRIDE_LOCK is.**
6bf0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
6c00: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
6c10: 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c  normally has fil
6c20: 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42  e scope only.  B
6c30: 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ut during testin
6c40: 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74  g, we make.** it
6c50: 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61   a global so tha
6c60: 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20  t the test code 
6c70: 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76  can change its v
6c80: 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  alue in order to
6c90: 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20   verify.** that 
6ca0: 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20  the right stuff 
6cb0: 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65  happens in eithe
6cc0: 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 53  r case..*/.#if S
6cd0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6ce0: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
6cf0: 6e 75 78 5f 5f 29 0a 23 20 20 69 66 6e 64 65 66  nux__).#  ifndef
6d00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6d10: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 20  VERRIDE_LOCK.#  
6d20: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
6d30: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6d40: 4c 4f 43 4b 20 2d 31 0a 23 20 20 65 6e 64 69 66  LOCK -1.#  endif
6d50: 0a 23 20 20 69 66 64 65 66 20 53 51 4c 49 54 45  .#  ifdef SQLITE
6d60: 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64  _TEST.int thread
6d70: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
6d80: 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54  ersLocks = SQLIT
6d90: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6da0: 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6c 73 65 0a  E_LOCK;.#  else.
6db0: 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65 61  static int threa
6dc0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
6dd0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49  hersLocks = SQLI
6de0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
6df0: 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6e 64 69  DE_LOCK;.#  endi
6e00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
6e10: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  This structure h
6e20: 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  olds information
6e30: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64   passed into ind
6e40: 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20  ividual test.** 
6e50: 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74  threads by the t
6e60: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
6e70: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
6e80: 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68  ne..*/.struct th
6e90: 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20  readTestData {. 
6ea0: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
6eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
6ec0: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
6ed0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
6ee0: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ock;     /* The 
6ef0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
6f00: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  n */.  int resul
6f10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6f20: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c   Result of the l
6f30: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
6f40: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c 49   */.};..#if SQLI
6f50: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
6f60: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
6f70: 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  __)./*.** This f
6f80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
6f90: 61 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74  as the main rout
6fa0: 69 6e 65 20 66 6f 72 20 61 20 74 68 72 65 61 64  ine for a thread
6fb0: 20 6c 61 75 6e 63 68 65 64 20 62 79 0a 2a 2a 20   launched by.** 
6fc0: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
6fd0: 67 42 65 68 61 76 69 6f 72 28 29 2e 20 49 74 20  gBehavior(). It 
6fe0: 74 65 73 74 73 20 77 68 65 74 68 65 72 20 74 68  tests whether th
6ff0: 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 62  e shared-lock ob
7000: 74 61 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  tained.** by the
7010: 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 20   main thread in 
7020: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
7030: 67 42 65 68 61 76 69 6f 72 28 29 20 63 6f 6e 66  gBehavior() conf
7040: 6c 69 63 74 73 20 77 69 74 68 20 61 0a 2a 2a 20  licts with a.** 
7050: 68 79 70 6f 74 68 65 74 69 63 61 6c 20 77 72 69  hypothetical wri
7060: 74 65 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64  te-lock obtained
7070: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
7080: 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
7090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74  ..**.** The writ
70a0: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63  e-lock is not ac
70b0: 74 75 61 6c 6c 79 20 61 63 71 75 69 72 65 64 2c  tually acquired,
70c0: 20 61 73 20 74 68 69 73 20 69 73 20 6e 6f 74 20   as this is not 
70d0: 70 6f 73 73 69 62 6c 65 20 69 66 20 0a 2a 2a 20  possible if .** 
70e0: 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  the file is open
70f0: 20 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f   in read-only mo
7100: 64 65 20 28 73 65 65 20 74 69 63 6b 65 74 20 23  de (see ticket #
7110: 33 34 37 32 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  3472)..*/ .stati
7120: 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f  c void *threadLo
7130: 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a  ckingTest(void *
7140: 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20  pArg){.  struct 
7150: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a  threadTestData *
7160: 70 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20  pData = (struct 
7170: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29  threadTestData*)
7180: 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72  pArg;.  pData->r
7190: 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44  esult = fcntl(pD
71a0: 61 74 61 2d 3e 66 64 2c 20 46 5f 47 45 54 4c 4b  ata->fd, F_GETLK
71b0: 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b  , &pData->lock);
71c0: 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a  .  return pArg;.
71d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
71e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
71f0: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
7200: 5f 5f 29 20 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c  __) */...#if SQL
7210: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
7220: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
7230: 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  x__)./*.** This 
7240: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
7250: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
7260: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7270: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
7280: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
7290: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
72a0: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
72b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
72c0: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
72d0: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
72e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
72f0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
7300: 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66  ngBehavior(int f
7310: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
7320: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  d;.  int rc;.  s
7330: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
7340: 44 61 74 61 20 64 3b 0a 20 20 73 74 72 75 63 74  Data d;.  struct
7350: 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70 74 68 72   flock l;.  pthr
7360: 65 61 64 5f 74 20 74 3b 0a 0a 20 20 66 64 20 3d  ead_t t;..  fd =
7370: 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20   dup(fd_orig);. 
7380: 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74 75   if( fd<0 ) retu
7390: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6c 2c  rn;.  memset(&l,
73a0: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 29 29 3b 0a   0, sizeof(l));.
73b0: 20 20 6c 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52    l.l_type = F_R
73c0: 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20  DLCK;.  l.l_len 
73d0: 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72 74  = 1;.  l.l_start
73e0: 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e   = 0;.  l.l_when
73f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
7400: 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 5f 6f   rc = fcntl(fd_o
7410: 72 69 67 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  rig, F_SETLK, &l
7420: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
7430: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
7440: 74 28 26 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&d, 0, sizeof(
7450: 64 29 29 3b 0a 20 20 64 2e 66 64 20 3d 20 66 64  d));.  d.fd = fd
7460: 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a  ;.  d.lock = l;.
7470: 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20    d.lock.l_type 
7480: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68  = F_WRLCK;.  pth
7490: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20  read_create(&t, 
74a0: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
74b0: 54 65 73 74 2c 20 26 64 29 3b 0a 20 20 70 74 68  Test, &d);.  pth
74c0: 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b  read_join(t, 0);
74d0: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
74e0: 69 66 28 20 64 2e 72 65 73 75 6c 74 21 3d 30 20  if( d.result!=0 
74f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 74 68 72 65  ) return;.  thre
7500: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
7510: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e  thersLocks = (d.
7520: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  lock.l_type==F_U
7530: 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  NLCK);.}.#endif 
7540: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 45 52 41 44  /* SQLITE_THERAD
7550: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7560: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 2f  __linux__) */../
7570: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
7580: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
7590: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
75a0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
75b0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f  ndLockInfo()..*/
75c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
75d0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72  easeLockInfo(str
75e0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
75f0: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20   *pLock){.  if( 
7600: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
7610: 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ck->nRef--;.    
7620: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
7630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7640: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a  pLock->pPrev ){.
7650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7660: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e  pLock->pPrev->pN
7670: 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20  ext==pLock );.  
7680: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72        pLock->pPr
7690: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63  ev->pNext = pLoc
76a0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
76b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
76c0: 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d  ssert( lockList=
76d0: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
76e0: 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f    lockList = pLo
76f0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
7700: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
7710: 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ck->pNext ){.   
7720: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
7730: 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ck->pNext->pPrev
7740: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
7750: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d     pLock->pNext-
7760: 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e  >pPrev = pLock->
7770: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
7780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7790: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  e(pLock);.    }.
77a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
77b0: 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43  ease a unixOpenC
77c0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
77d0: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
77e0: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
77f0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
7800: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
7810: 6e 74 28 73 74 72 75 63 74 20 75 6e 69 78 4f 70  nt(struct unixOp
7820: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
7830: 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20   if( pOpen ){.  
7840: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
7850: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
7860: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
7870: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65   if( pOpen->pPre
7880: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
7890: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65  ert( pOpen->pPre
78a0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70 65 6e 20  v->pNext==pOpen 
78b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  );.        pOpen
78c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
78d0: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20   pOpen->pNext;. 
78e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
78f0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 65 6e      assert( open
7900: 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20  List==pOpen );. 
7910: 20 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20         openList 
7920: 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a  = pOpen->pNext;.
7930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7940: 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 29  ( pOpen->pNext )
7950: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7960: 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e  ( pOpen->pNext->
7970: 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a  pPrev==pOpen );.
7980: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70          pOpen->p
7990: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f  Next->pPrev = pO
79a0: 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  pen->pPrev;.    
79b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
79c0: 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50  3_free(pOpen->aP
79d0: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 73  ending);.      s
79e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
79f0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  n);.    }.  }.}.
7a00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
7a10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
7a20: 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49  locate unixLockI
7a30: 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e  nfo and unixOpen
7a40: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74  Cnt structures t
7a50: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
7a60: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
7a70: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e  iptor.  Create n
7a80: 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73  ew ones if neces
7a90: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
7aa0: 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68  turn values migh
7ab0: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
7ac0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
7ad0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ccurs..**.** Ret
7ae0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
7af0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
7b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
7b10: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69  dLockInfo(.  uni
7b20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
7b40: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
7b50: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
7b60: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  the key */.  str
7b70: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
7b80: 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52   **ppLock,  /* R
7b90: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f  eturn the unixLo
7ba0: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
7bb0: 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
7bc0: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a  t unixOpenCnt **
7bd0: 70 70 4f 70 65 6e 20 20 20 20 2f 2a 20 52 65 74  ppOpen    /* Ret
7be0: 75 72 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e  urn the unixOpen
7bf0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
7c10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
7c30: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
7c40: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
7c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7c70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7c80: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
7c90: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65  truct unixLockKe
7ca0: 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a  y lockKey;    /*
7cb0: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
7cc0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  the unixLockInfo
7cd0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7ce0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
7cf0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
7d00: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
7d10: 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74   the unixOpenCnt
7d20: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 74 72   struct */.  str
7d30: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
7d40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
7d50: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
7d60: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  formation */.  s
7d70: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7d80: 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 2f 2a  fo *pLock;    /*
7d90: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4c   Candidate unixL
7da0: 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  ockInfo object *
7db0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  /.  struct unixO
7dc0: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20  penCnt *pOpen;  
7dd0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
7de0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65  unixOpenCnt obje
7df0: 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 74 20  ct */..  /* Get 
7e00: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
7e10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
7e20: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
7e30: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
7e40: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
7e50: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
7e60: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
7e70: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73  le->h;.  rc = fs
7e80: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
7e90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
7ea0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
7eb0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7ec0: 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57  #ifdef EOVERFLOW
7ed0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
7ee0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
7ef0: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
7f00: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
7f10: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
7f20: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
7f30: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
7f40: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
7f50: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
7f60: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
7f70: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
7f80: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
7f90: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
7fa0: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
7fb0: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
7fc0: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
7fd0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
7fe0: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
7ff0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
8000: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
8010: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
8020: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
8030: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
8040: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
8050: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
8060: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
8070: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
8080: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
8090: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
80a0: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
80b0: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
80c0: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
80d0: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
80e0: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
80f0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
8100: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
8110: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
8120: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
8130: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
8140: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
8150: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
8160: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
8170: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
8180: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
8190: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
81a0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
81b0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ize==0 ){.    rc
81c0: 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22   = write(fd, "S"
81d0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
81e0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
81f0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
8210: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
8220: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
8230: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
8240: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
8250: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
8260: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
8280: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f  if..  memset(&lo
8290: 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66  ckKey, 0, sizeof
82a0: 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f  (lockKey));.  lo
82b0: 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76 20 3d 20  ckKey.fid.dev = 
82c0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
82d0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
82e0: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64   lockKey.fid.pId
82f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
8300: 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  else.  lockKey.f
8310: 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  id.ino = statbuf
8320: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
8330: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
8340: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
8350: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66  (__linux__).  if
8360: 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  ( threadsOverrid
8370: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
8380: 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68  <0 ){.    testTh
8390: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
83a0: 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c  ior(fd);.  }.  l
83b0: 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20 74 68 72  ockKey.tid = thr
83c0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
83d0: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
83e0: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
83f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69 6c 65 49  ;.#endif.  fileI
8400: 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b  d = lockKey.fid;
8410: 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30  .  if( ppLock!=0
8420: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
8430: 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68  lockList;.    wh
8440: 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65  ile( pLock && me
8450: 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26  mcmp(&lockKey, &
8460: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20  pLock->lockKey, 
8470: 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29  sizeof(lockKey))
8480: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
8490: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
84a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
84b0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
84c0: 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  pLock = sqlite3_
84d0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
84e0: 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 20 20  pLock) );.      
84f0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
8500: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
8510: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
8520: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
8530: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20  dlockinfo;.     
8540: 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e   }.      pLock->
8550: 6c 6f 63 6b 4b 65 79 20 3d 20 6c 6f 63 6b 4b 65  lockKey = lockKe
8560: 79 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  y;.      pLock->
8570: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
8580: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a  pLock->cnt = 0;.
8590: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
85a0: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  ktype = 0;.     
85b0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
85c0: 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20  lockList;.      
85d0: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30  pLock->pPrev = 0
85e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b  ;.      if( lock
85f0: 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d  List ) lockList-
8600: 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a  >pPrev = pLock;.
8610: 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d        lockList =
8620: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73   pLock;.    }els
8630: 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  e{.      pLock->
8640: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8650: 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63    *ppLock = pLoc
8660: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 4f  k;.  }.  if( ppO
8670: 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f  pen!=0 ){.    pO
8680: 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a  pen = openList;.
8690: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e      while( pOpen
86a0: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
86b0: 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65  Id, &pOpen->file
86c0: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
86d0: 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  d)) ){.      pOp
86e0: 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  en = pOpen->pNex
86f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
8700: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
8710: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
8720: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8730: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
8740: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
8750: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
8760: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
8770: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
8780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8790: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
87a0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
87b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
87c0: 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65  n->fileId = file
87d0: 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  Id;.      pOpen-
87e0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
87f0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20   pOpen->nLock = 
8800: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
8810: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
8820: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
8830: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
8840: 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70  Open->pNext = op
8850: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4f  enList;.      pO
8860: 70 65 6e 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  pen->pPrev = 0;.
8870: 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69        if( openLi
8880: 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70  st ) openList->p
8890: 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Prev = pOpen;.  
88a0: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
88b0: 4f 70 65 6e 3b 0a 23 69 66 20 4f 53 5f 56 58 57  Open;.#if OS_VXW
88c0: 4f 52 4b 53 0a 20 20 20 20 20 20 70 4f 70 65 6e  ORKS.      pOpen
88d0: 2d 3e 70 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20  ->pSem = NULL;. 
88e0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d       pOpen->aSem
88f0: 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
8900: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
8910: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  {.      pOpen->n
8920: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
8930: 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e   *ppOpen = pOpen
8940: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64  ;.  }..exit_find
8950: 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75  lockinfo:.  retu
8960: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8970: 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  If we are curren
8980: 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65  tly in a differe
8990: 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74  nt thread than t
89a0: 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74  he thread that t
89b0: 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61  he.** unixFile a
89c0: 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20  rgument belongs 
89d0: 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  to, then transfe
89e0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  r ownership of t
89f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f  he unixFile.** o
8a00: 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65  ver to the curre
8a10: 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  nt thread..**.**
8a20: 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f   A unixFile is o
8a30: 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74  nly owned by a t
8a40: 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73  hread on systems
8a50: 20 74 68 61 74 20 75 73 65 20 4c 69 6e 75 78 54   that use LinuxT
8a60: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77  hreads..**.** Ow
8a70: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
8a80: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
8a90: 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   if the unixFile
8aa0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8ab0: 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68  locked..** If th
8ac0: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f  e unixFile is lo
8ad0: 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65  cked and an owne
8ae0: 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20  rship is wrong, 
8af0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53  then return.** S
8b00: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53  QLITE_MISUSE.  S
8b10: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
8b20: 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
8b30: 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66  ng works..*/.#if
8b40: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8b50: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8b60: 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74 69 63 20  linux__).static 
8b70: 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  int transferOwne
8b80: 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a  rship(unixFile *
8b90: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
8ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53  ;.  pthread_t hS
8bb0: 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61  elf;.  if( threa
8bc0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
8bd0: 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20  hersLocks ){.   
8be0: 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72   /* Ownership tr
8bf0: 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64  ansfers not need
8c00: 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65  ed on this syste
8c10: 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  m */.    return 
8c20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8c30: 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64   hSelf = pthread
8c40: 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70  _self();.  if( p
8c50: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69  thread_equal(pFi
8c60: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20  le->tid, hSelf) 
8c70: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
8c80: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61   still in the sa
8c90: 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20  me thread */.   
8ca0: 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72   OSTRACE1("No-tr
8cb0: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
8cc0: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
8cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8ce0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
8cf0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
8d00: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
8d10: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
8d20: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
8d30: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
8d40: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
8d50: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
8d60: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
8d70: 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73  "Transfer owners
8d80: 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25  hip of %d from %
8d90: 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d to %d\n",.    
8da0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
8db0: 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  , pFile->tid, hS
8dc0: 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74  elf);.  pFile->t
8dd0: 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66  id = hSelf;.  if
8de0: 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21   (pFile->pLock !
8df0: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65  = NULL) {.    re
8e00: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
8e10: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
8e20: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
8e30: 66 6f 28 70 46 69 6c 65 2c 20 26 70 46 69 6c 65  fo(pFile, &pFile
8e40: 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20  ->pLock, 0);.   
8e50: 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20   OSTRACE5("LOCK 
8e60: 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28     %d is now %s(
8e70: 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  %s,%d)\n", pFile
8e80: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
8e90: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
8ea0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
8eb0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
8ec0: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c  peName(pFile->pL
8ed0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
8ee0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  pFile->pLock->cn
8ef0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  t);.    return r
8f00: 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
8f10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f20: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20  OK;.  }.}.#else 
8f30: 20 2f 2a 20 69 66 20 6e 6f 74 20 53 51 4c 49 54   /* if not SQLIT
8f40: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
8f50: 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74    /* On single-t
8f60: 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20  hreaded builds, 
8f70: 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  ownership transf
8f80: 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f  er is a no-op */
8f90: 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66  .# define transf
8fa0: 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53  erOwnership(X) S
8fb0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20  QLITE_OK.#endif 
8fc0: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  /* SQLITE_THREAD
8fd0: 53 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  SAFE */.../*.** 
8fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
8ff0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
9000: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9010: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
9020: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
9030: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
9040: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
9050: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
9060: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
9070: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
9080: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
9090: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
90a0: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
90b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
90c0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
90d0: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
90e0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
90f0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
9100: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
9110: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
9120: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
9130: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
9140: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
9150: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9160: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
9170: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
9180: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
9190: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
91a0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
91b0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
91c0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
91d0: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
91e0: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
91f0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
9200: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
9210: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
9220: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
9230: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
9240: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
9250: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
9260: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
9270: 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if( pFile->pLock
9280: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
9290: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
92a0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
92b0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
92c0: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
92d0: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
92e0: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
92f0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
9300: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
9310: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
9320: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
9330: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
9340: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
9350: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
9360: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
9370: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
9380: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
9390: 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20 3d  CK;.    if (-1 =
93a0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
93b0: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
93c0: 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  )) {.      int t
93d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
93e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
93f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9400: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9410: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
9420: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
9430: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9440: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
9450: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63    } else if( loc
9460: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
9470: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72  K ){.      reser
9480: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
9490: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75   }.#endif.  .  u
94a0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
94b0: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
94c0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
94d0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
94e0: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
94f0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
9500: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
9510: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
9520: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
9530: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
9540: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
9550: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
9560: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
9570: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
9580: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
9590: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
95a0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
95b0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
95c0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
95d0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
95e0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
95f0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
9600: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
9610: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
9620: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
9630: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
9640: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
9650: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
9660: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
9670: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
9680: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
9690: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
96a0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
96b0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
96c0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
96d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
96e0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
96f0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
9700: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
9710: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
9720: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
9730: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
9740: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
9750: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
9760: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
9770: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
9780: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
9790: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
97a0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
97b0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
97c0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
97d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
97e0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
97f0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
9800: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
9810: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
9820: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
9830: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
9840: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
9850: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9860: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
9870: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
9880: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
9890: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
98a0: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
98b0: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
98c0: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
98d0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
98e0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
98f0: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
9900: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
9910: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
9920: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
9930: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
9940: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
9950: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
9960: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
9970: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
9980: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
9990: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
99a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
99b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
99c0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
99d0: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
99e0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
99f0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
9a00: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
9a10: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
9a20: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
9a30: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
9a40: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
9a50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9a60: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
9a70: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
9a80: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
9a90: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
9aa0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
9ab0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9ac0: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
9ad0: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
9ae0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
9af0: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
9b00: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
9b10: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
9b20: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
9b30: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
9b40: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
9b50: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
9b60: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
9b70: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
9b80: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9b90: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
9ba0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
9bb0: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
9bc0: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
9bd0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
9be0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
9bf0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
9c00: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
9c10: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
9c20: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
9c30: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
9c40: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
9c50: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
9c60: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
9c70: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
9c80: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
9c90: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
9ca0: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
9cb0: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
9cc0: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
9cd0: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
9ce0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
9cf0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
9d00: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
9d10: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
9d20: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
9d30: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
9d40: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
9d50: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
9d60: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
9d70: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
9d80: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
9d90: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
9da0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
9db0: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
9dc0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
9dd0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
9de0: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
9df0: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
9e00: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
9e10: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
9e20: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
9e30: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
9e40: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
9e50: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
9e60: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
9e70: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
9e80: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9e90: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
9ea0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
9eb0: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
9ec0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
9ed0: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
9ee0: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
9ef0: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
9f00: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
9f10: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
9f20: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
9f30: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
9f40: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
9f50: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
9f60: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
9f70: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
9f80: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
9f90: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
9fa0: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
9fb0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9fc0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9fd0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
9fe0: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
9ff0: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
a000: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
a010: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
a020: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
a030: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
a040: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
a050: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
a060: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
a070: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
a080: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
a090: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
a0a0: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
a0b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a0c0: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
a0d0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
a0e0: 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75  *)id;.  struct u
a0f0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
a100: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
a110: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
a120: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
a130: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a140: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
a150: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
a160: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
a170: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
a180: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
a190: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
a1a0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
a1b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
a1c0: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
a1d0: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
a1e0: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
a1f0: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
a200: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
a210: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
a220: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
a230: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
a240: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
a250: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
a260: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
a270: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
a280: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
a290: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
a2a0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
a2b0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
a2c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
a2d0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
a2e0: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
a2f0: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
a300: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
a310: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
a320: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
a330: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
a340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a350: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
a360: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
a370: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
a380: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
a390: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
a3a0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
a3b0: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
a3c0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
a3d0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
a3e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
a3f0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
a400: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
a410: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
a420: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a430: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
a440: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
a450: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
a460: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
a470: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
a480: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
a490: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
a4a0: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
a4b0: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
a4c0: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
a4d0: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
a4e0: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
a4f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a500: 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
a510: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
a520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a530: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
a540: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
a550: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
a560: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
a570: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
a580: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
a590: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
a5a0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
a5b0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
a5c0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
a5d0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c  .  if( (pFile->l
a5e0: 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e  ocktype!=pLock->
a5f0: 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20  locktype && .   
a600: 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c         (pLock->l
a610: 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  ocktype>=PENDING
a620: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
a630: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  e>SHARED_LOCK)).
a640: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a650: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
a660: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a670: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
a680: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
a690: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
a6a0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
a6b0: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
a6c0: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
a6d0: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
a6e0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
a6f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
a700: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
a710: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
a720: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
a730: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
a740: 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e   .      (pLock->
a750: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a760: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
a770: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
a780: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
a790: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a7a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
a7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
a7c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  le->locktype==0 
a7d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a7e0: 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20  Lock->cnt>0 );. 
a7f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a800: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a810: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ;.    pLock->cnt
a820: 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  ++;.    pFile->p
a830: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a840: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a850: 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  ;.  }..  lock.l_
a860: 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63  len = 1L;..  loc
a870: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a880: 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50  K_SET;..  /* A P
a890: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
a8a0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
a8b0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
a8c0: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
a8d0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
a8e0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
a8f0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
a900: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
a910: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
a920: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
a930: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
a940: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
a950: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
a960: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a970: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
a980: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
a990: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
a9a0: 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70  _type = (locktyp
a9b0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  e==SHARED_LOCK?F
a9c0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
a9d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a9e0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
a9f0: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
aa00: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
aa10: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
aa20: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
aa30: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
aa40: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
aa50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
aa60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
aa70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
aa80: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
aa90: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
aaa0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
aab0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
aac0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
aad0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
aae0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
aaf0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
ab00: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
ab10: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
ab20: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
ab30: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
ab40: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
ab50: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
ab60: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
ab70: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ab80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ab90: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
aba0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
abb0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
abc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
abd0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
abe0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
abf0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
ac00: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
ac10: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ac20: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
ac30: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
ac40: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
ac50: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
ac60: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
ac70: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ac80: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac90: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
aca0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
acb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
acc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
acd0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
ace0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
acf0: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
ad00: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ad10: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
ad20: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
ad30: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
ad40: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
ad50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
ad60: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
ad70: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
ad80: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
ad90: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ada0: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
adb0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
adc0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
add0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ade0: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
adf0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ae00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ae10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ae20: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ae30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae40: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
ae50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ae60: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
ae70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ae80: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
ae90: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
aea0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
aeb0: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
aec0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
aed0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aee0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aef0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
af00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
af10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
af20: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
af30: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
af40: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
af50: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
af60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
af70: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
af80: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
af90: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
afa0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
afb0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
afc0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
afd0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
afe0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
aff0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
b000: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
b010: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
b020: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
b030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
b040: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
b050: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
b060: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
b070: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
b080: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
b090: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
b0a0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
b0b0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
b0c0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
b0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
b0e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b0f0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
b100: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
b110: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
b120: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
b130: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
b140: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
b150: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
b160: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
b170: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b180: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
b190: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
b1a0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
b1b0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
b1c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
b1d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
b1f0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
b200: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
b210: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
b220: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b230: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
b240: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b250: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
b260: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
b270: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b280: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b290: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
b2a0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
b2b0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
b2d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b2e0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
b2f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
b300: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
b310: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
b320: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
b330: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
b340: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
b350: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
b360: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
b370: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
b380: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
b390: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
b3a0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
b3b0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
b3c0: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
b3d0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
b3e0: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
b3f0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
b400: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b410: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
b420: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ->locktype<=SHAR
b430: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 6c 6f  ED_LOCK.   && lo
b440: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
b450: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
b460: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
b470: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
b480: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
b490: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
b4a0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
b4b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
b4c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b4d0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
b4e0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b4f0: 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  pe;.    pLock->l
b500: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b510: 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pe;.  }else if( 
b520: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
b530: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
b540: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b550: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
b560: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
b570: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
b580: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
b590: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
b5a0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
b5b0: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
b5c0: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
b5d0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
b5e0: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
b5f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
b600: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
b610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
b620: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
b630: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
b640: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
b650: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
b660: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
b670: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
b680: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
b690: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
b6a0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
b6b0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
b6c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
b6d0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
b6e0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
b6f0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
b700: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
b710: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
b720: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
b730: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
b740: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
b750: 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20  type){.  struct 
b760: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
b770: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
b780: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
b790: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b7a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b7b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b7c0: 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  d;.  int h;..  a
b7d0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b7e0: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
b7f0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
b800: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
b810: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
b820: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
b830: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
b840: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
b850: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
b860: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
b870: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
b880: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
b890: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
b8a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
b8b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
b8c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b8d0: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
b8e0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
b8f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b900: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
b910: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
b920: 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c  ex();.  h = pFil
b930: 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20  e->h;.  pLock = 
b940: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
b950: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
b960: 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
b970: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
b980: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
b990: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b9a0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65  >locktype==pFile
b9b0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
b9c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b9d0: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
b9e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
b9f0: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
ba00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
ba10: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
ba20: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
ba30: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
ba40: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
ba50: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
ba60: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
ba70: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
ba80: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
ba90: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
baa0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
bab0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
bac0: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
bad0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
bae0: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
baf0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
bb00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
bb10: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
bb20: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
bb30: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
bb40: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
bb50: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
bb60: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
bb70: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
bb80: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
bb90: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
bba0: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
bbb0: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
bbc0: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
bbd0: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
bbe0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
bbf0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
bc00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
bc10: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
bc20: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
bc30: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
bc40: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
bc50: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
bc60: 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
bc70: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
bc80: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20   0;.#endif...   
bc90: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
bca0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
bcb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
bcc0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
bcd0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bce0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
bcf0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bd00: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bd10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bd20: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
bd30: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
bd40: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bd50: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bd60: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
bd70: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
bd80: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bd90: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
bda0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
bdb0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
bdc0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bdd0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bde0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bdf0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
be00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
be10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
be20: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
be30: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
be40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
be50: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
be60: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
be70: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
be80: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
be90: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
bea0: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
beb0: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
bec0: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
bed0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
bee0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
bef0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  ) ){.      pLock
bf00: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
bf10: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
bf20: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  lse{.      int t
bf30: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
bf40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bf50: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
bf60: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
bf70: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
bf80: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
bf90: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
bfa0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
bfb0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
bfc0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 09 09 09 67  no;.      }....g
bfd0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
bfe0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bff0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
c000: 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  K ){.    struct 
c010: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
c020: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
c030: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
c040: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
c050: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
c060: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
c070: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
c080: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
c090: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
c0a0: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
c0b0: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
c0c0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
c0d0: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
c0e0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
c0f0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
c100: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c110: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
c120: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c130: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
c140: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
c150: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69  n = 0L;.      Si
c160: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c170: 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
c180: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
c190: 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
c1a0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c1b0: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
c1c0: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
c1d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
c1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
c1f0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
c200: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
c210: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
c220: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c230: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c240: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c250: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c270: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
c280: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
c290: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
c2a0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c2b0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
c2c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
c2d0: 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09  ck->cnt = 1;....
c2e0: 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b  .goto end_unlock
c2f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c300: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
c310: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
c320: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
c330: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
c340: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
c350: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
c360: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
c370: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
c380: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
c390: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
c3a0: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
c3b0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
c3c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c3d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c3e0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  .      pOpen = p
c3f0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
c400: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
c410: 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
c420: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
c430: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
c440: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26  pen->nLock==0 &&
c450: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
c460: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
c470: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
c480: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
c490: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
c4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
c4b0: 65 20 70 65 6e 64 69 6e 67 20 66 64 73 2c 20 62  e pending fds, b
c4c0: 75 74 20 69 66 20 63 6c 6f 73 69 6e 67 20 66 61  ut if closing fa
c4d0: 69 6c 73 20 64 6f 6e 27 74 20 66 72 65 65 20 74  ils don't free t
c4e0: 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 20  he array.       
c4f0: 20 20 20 2a 2a 20 61 73 73 69 67 6e 20 2d 31 20     ** assign -1 
c500: 74 6f 20 74 68 65 20 73 75 63 63 65 73 73 66 75  to the successfu
c510: 6c 6c 79 20 63 6c 6f 73 65 64 20 64 65 73 63 72  lly closed descr
c520: 69 70 74 6f 72 73 20 61 6e 64 20 72 65 63 6f 72  iptors and recor
c530: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
c540: 2a 2a 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e  ** error.  The n
c550: 65 78 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ext attempt to u
c560: 6e 6c 6f 63 6b 20 77 69 6c 6c 20 74 72 79 20 61  nlock will try a
c570: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  gain. */.       
c580: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50     if( pOpen->aP
c590: 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20  ending[i] < 0 ) 
c5a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c5b0: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 4f      if( close(pO
c5c0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
c5d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
c5e0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c5f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c600: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c610: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
c620: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
c630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
c640: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20  en->aPending[i] 
c650: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
c660: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c670: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c680: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c6a0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
c6b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65  ;.          pOpe
c6c0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e  .          pOpen
c6e0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
c6f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c700: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e  }.    }.  }...en
c710: 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  d_unlock:.  unix
c720: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
c730: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c740: 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  K ) pFile->lockt
c750: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
c760: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c780: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
c790: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
c7a0: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
c7b0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
c7c0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
c7d0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
c7e0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
c7f0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
c800: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
c810: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
c820: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
c830: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
c840: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
c850: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
c860: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
c870: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
c880: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
c890: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
c8a0: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
c8b0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
c8c0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
c8d0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
c8e0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
c8f0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
c900: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
c910: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
c920: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
c930: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
c940: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
c950: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
c960: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
c970: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
c980: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
c990: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
c9a0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
c9b0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c9c0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
c9d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c9e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
c9f0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
ca00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
ca10: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
ca20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ca30: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
ca40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
ca50: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
ca60: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
ca70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
ca80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ca90: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
caa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
cab0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
cac0: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
cad0: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
cae0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
caf0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
cb00: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
cb10: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
cb20: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
cb30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
cb40: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
cb50: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
cb60: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
cb70: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
cb80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
cb90: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
cba0: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
cbb0: 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  );.    OpenCount
cbc0: 65 72 28 2d 31 29 3b 0a 20 20 20 20 6d 65 6d 73  er(-1);.    mems
cbd0: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
cbe0: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
cbf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cc00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cc10: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
cc20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
cc30: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
cc40: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
cc50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cc60: 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
cc70: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
cc80: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
cc90: 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  ;.    unixUnlock
cca0: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
ccb0: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
ccc0: 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
ccd0: 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69  le->pOpen && pFi
cce0: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
ccf0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
cd00: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
cd10: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
cd20: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
cd30: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
cd40: 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
cd50: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
cd60: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
cd70: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
cd80: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
cd90: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
cda0: 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
cdb0: 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
cdc0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
cdd0: 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
cde0: 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
cdf0: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
ce00: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a    */.      int *
ce10: 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75  aNew;.      stru
ce20: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
ce30: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
ce40: 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77  Open;.      aNew
ce50: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
ce60: 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  oc(pOpen->aPendi
ce70: 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
ce80: 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
ce90: 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nt) );.      if(
cea0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
ceb0: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
cec0: 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c  oc fails, just l
ced0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
cee0: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20  criptor */.     
cef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cf00: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
cf10: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
cf20: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
cf30: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
cf40: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
cf50: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
cf60: 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ding++;.        
cf70: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cf90: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
cfa0: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
cfb0: 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
cfc0: 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
cfd0: 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
cfe0: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
cff0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
d000: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
d010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
d020: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
d030: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
d040: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
d050: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
d060: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
d070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0b0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
d110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d120: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
d130: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d150: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
d160: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
d170: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
d180: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
d190: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
d1a0: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
d1b0: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
d1c0: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
d1d0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
d1e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
d1f0: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
d200: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
d210: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
d220: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
d230: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
d240: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
d250: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
d260: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
d270: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
d280: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
d290: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
d2a0: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
d2b0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
d2c0: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
d2d0: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
d2e0: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
d2f0: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
d300: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
d310: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
d320: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
d330: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
d340: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
d350: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
d360: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
d370: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
d380: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
d390: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
d3a0: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
d3b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d3c0: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
d3d0: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
d3e0: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
d3f0: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
d400: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
d410: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
d420: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
d430: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
d440: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
d450: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
d460: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
d470: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
d480: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d490: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
d4a0: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
d4b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d4c0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
d4d0: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
d4e0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
d4f0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
d500: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
d510: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
d520: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
d530: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
d540: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
d550: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d560: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
d570: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
d580: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
d590: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
d5a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d5b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
d5c0: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
d5d0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
d5e0: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
d5f0: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
d600: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
d610: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
d620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
d630: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
d640: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
d650: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
d660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
d670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
d6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
d710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d720: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
d730: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
d740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
d760: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
d770: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
d780: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
d790: 73 74 69 6e 67 20 6f 66 20 73 65 70 61 72 61 74  sting of separat
d7a0: 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20  e lock.** files 
d7b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
d7c0: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
d7d0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
d7e0: 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a  s works on just.
d7f0: 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  ** about every f
d800: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
d810: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
d820: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
d830: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
d840: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
d850: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
d860: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
d870: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
d880: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
d890: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
d8a0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
d8b0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
d8c0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
d8d0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
d8e0: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
d8f0: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
d900: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
d910: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
d920: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
d930: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
d940: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
d950: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
d960: 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
d970: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
d980: 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
d990: 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
d9a0: 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
d9b0: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
d9c0: 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
d9d0: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
d9e0: 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65  ng a file in the
d9f0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
da00: 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  as the.** databa
da10: 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
da20: 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
da30: 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
da40: 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
da50: 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   The existance o
da60: 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d  f a lock file im
da70: 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
da80: 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
da90: 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65  her lock.** type
daa0: 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
dab0: 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
dac0: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
dad0: 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
dae0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
daf0: 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
db00: 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
db10: 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
db20: 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
db30: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69  k file..*/.#defi
db40: 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
db50: 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
db60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
db70: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
db80: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
db90: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
dba0: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
dbb0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
dbc0: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
dbd0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
dbe0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
dbf0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
dc00: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
dc10: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
dc20: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
dc30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
dc40: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
dc50: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
dc60: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
dc70: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
dc80: 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
dc90: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
dca0: 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
dcb0: 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
dcc0: 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
dcd0: 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
dce0: 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
dcf0: 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
dd00: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
dd10: 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
dd20: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dd30: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
dd40: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
dd50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
dd60: 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
dd70: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
dd80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
dd90: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
dda0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ddb0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
ddc0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
ddd0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
dde0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
ddf0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
de00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
de10: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
de20: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
de30: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
de40: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
de50: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
de60: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
de70: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
de80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
de90: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
dea0: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
deb0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
dec0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
ded0: 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
dee0: 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
def0: 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
df00: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
df10: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
df20: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
df30: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
df40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
df50: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
df60: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
df70: 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
df80: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
df90: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
dfa0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
dfb0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
dfc0: 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
dfd0: 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  = access(zLockFi
dfe0: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
dff0: 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
e000: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
e010: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
e020: 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20  c, reserved);.  
e030: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
e040: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
e050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
e060: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
e070: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
e080: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
e090: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
e0a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e0b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
e0c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
e0d0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
e0e0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
e0f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
e100: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
e110: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
e120: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
e130: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
e140: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
e150: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
e160: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
e170: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
e180: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
e190: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
e1a0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
e1b0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
e1c0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
e1d0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
e1e0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
e1f0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
e200: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
e210: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
e220: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
e230: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
e240: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
e250: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
e260: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
e270: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
e280: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
e290: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
e2a0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
e2b0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
e2c0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
e2d0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e2e0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e2f0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
e300: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
e310: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
e320: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
e330: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
e340: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
e350: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
e360: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
e370: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
e380: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
e390: 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
e3a0: 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
e3b0: 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
e3c0: 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
e3d0: 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
e3e0: 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
e3f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
e400: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
e410: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e420: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
e430: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e440: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e450: 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68  ;.  int fd;.  ch
e460: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
e470: 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
e480: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
e490: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e4a0: 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
e4b0: 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
e4c0: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
e4d0: 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
e4e0: 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
e4f0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
e500: 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
e510: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
e520: 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
e530: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
e540: 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
e550: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
e560: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
e570: 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57  ype;.#if !OS_VXW
e580: 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ORKS.    /* Alwa
e590: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
e5a0: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
e5b0: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
e5c0: 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
e5d0: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
e5e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e5f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e600: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
e610: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
e620: 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65  = open(zLockFile
e630: 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41  ,O_RDONLY|O_CREA
e640: 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a  T|O_EXCL,0600);.
e650: 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
e660: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
e670: 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
e680: 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ile, someone els
e690: 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65  e may have stole
e6a0: 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  n the lock */.  
e6b0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
e6c0: 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
e6d0: 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
e6e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e6f0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
e700: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
e710: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e720: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e730: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e740: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
e750: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
e760: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
e770: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e780: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
e790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
e7a0: 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66  rn rc;.  } .  if
e7b0: 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20  ( close(fd) ){. 
e7c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e7d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e7e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e7f0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20  RR_CLOSE;.  }.  
e800: 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
e810: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
e820: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
e830: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
e840: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
e850: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e860: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
e870: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
e880: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
e890: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
e8a0: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
e8b0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
e8c0: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
e8d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
e8e0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
e8f0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
e900: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
e910: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
e920: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
e930: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
e940: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
e950: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
e960: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e970: 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
e980: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
e990: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
e9a0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
e9b0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e9c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e9d0: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
e9e0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e9f0: 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
ea00: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
ea10: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
ea20: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
ea30: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
ea40: 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
ea50: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
ea60: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
ea70: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
ea80: 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
ea90: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
eaa0: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
eab0: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
eac0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
ead0: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
eae0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
eaf0: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
eb00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
eb10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
eb20: 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
eb30: 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
eb40: 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
eb50: 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
eb60: 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
eb70: 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
eb80: 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
eb90: 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
eba0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
ebb0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
ebc0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
ebd0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
ebe0: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
ebf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ec00: 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
ec10: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
ec20: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
ec30: 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
ec40: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
ec50: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
ec60: 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
ec70: 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
ec80: 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
ec90: 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54  ;.    if( ENOENT
eca0: 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
ecb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
ecc0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ecd0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ece0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
ed00: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
ed10: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
ed20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ed30: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
ed40: 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
ed50: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ed60: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
ed70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ed80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ed90: 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
eda0: 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
edb0: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
edc0: 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
edd0: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
ede0: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
edf0: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
ee00: 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
ee10: 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
ee20: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ee30: 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
ee40: 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
ee50: 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
ee60: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
ee70: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
ee80: 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
ee90: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
eea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
eeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eec0: 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
eed0: 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
eee0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
eef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
efc0: 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
eff0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
f000: 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
f010: 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
f020: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
f030: 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
f040: 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
f050: 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
f060: 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
f070: 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
f080: 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
f090: 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
f0a0: 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
f0b0: 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
f0c0: 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
f0d0: 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
f0e0: 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
f0f0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
f100: 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
f110: 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
f120: 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
f130: 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
f140: 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
f150: 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
f160: 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
f170: 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
f180: 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
f190: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
f1a0: 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
f1c0: 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
f1d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f1e0: 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
f1f0: 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
f200: 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
f210: 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
f220: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f230: 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
f240: 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
f250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
f260: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
f270: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
f280: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
f290: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
f2a0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
f2b0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
f2c0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
f2d0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
f2e0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
f2f0: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
f300: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
f310: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
f320: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
f330: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
f340: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
f350: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
f360: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
f370: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
f380: 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
f390: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
f3a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f3b0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
f3c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f3d0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
f3e0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
f3f0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f400: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
f410: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
f420: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f430: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
f440: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
f450: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
f460: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
f470: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
f480: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
f490: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
f4a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
f4b0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
f4c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
f4d0: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
f4e0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
f4f0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
f500: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
f510: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
f520: 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
f530: 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
f540: 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
f550: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f560: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
f570: 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
f580: 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
f590: 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
f5a0: 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
f5b0: 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46    lrc = flock(pF
f5c0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
f5d0: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
f5e0: 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
f5f0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f600: 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
f610: 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
f620: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
f630: 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
f640: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f650: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f660: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
f670: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
f680: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
f690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
f6a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f6b0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
f6c0: 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
f6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f6e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
f6f0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
f700: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
f710: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
f720: 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
f730: 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
f740: 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
f750: 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
f760: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f770: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f780: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
f790: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f7a0: 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
f7b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f7c0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
f7d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
f7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f7f0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22    }.  OSTRACE4("
f800: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
f810: 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %d\n", pFile-
f820: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
f830: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
f840: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
f850: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
f860: 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
f870: 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
f880: 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
f890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f8a0: 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
f8b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f8c0: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
f8d0: 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
f8e0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
f8f0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
f900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
f910: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
f920: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
f930: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
f940: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
f950: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
f960: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
f970: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
f980: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
f990: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
f9a0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
f9b0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
f9c0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
f9d0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
f9e0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
f9f0: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
fa00: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
fa10: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
fa20: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
fa30: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
fa40: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
fa50: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
fa60: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
fa70: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
fa80: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
fa90: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
faa0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
fab0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
fac0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
fad0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
fae0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
faf0: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
fb00: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
fb10: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
fb20: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
fb30: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
fb40: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
fb50: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
fb60: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
fb70: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
fb80: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
fb90: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
fba0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
fbb0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
fbc0: 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
fbd0: 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
fbe0: 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
fbf0: 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
fc00: 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
fc10: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
fc20: 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
fc30: 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
fc40: 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
fc50: 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
fc60: 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
fc70: 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
fc80: 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
fc90: 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
fca0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
fcb0: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
fcc0: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
fcd0: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
fce0: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
fcf0: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
fd00: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
fd20: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
fd30: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
fd40: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74  ocktype) {.  int
fd50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fd60: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fd70: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
fd80: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
fd90: 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
fda0: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
fdb0: 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
fdc0: 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
fdd0: 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
fde0: 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
fdf0: 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
fe00: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
fe10: 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
fe20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
fe30: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
fe40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fe50: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
fe60: 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
fe70: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
fe80: 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c    if (flock(pFil
fe90: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
fea0: 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
feb0: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
fec0: 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
fed0: 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
fee0: 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
fef0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ff00: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ff10: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
ff20: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
ff30: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
ff40: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
ff50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
ff60: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  no;.    }.  } el
ff70: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
ff80: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
ff90: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
ffa0: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
ffb0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
ffc0: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
ffd0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
ffe0: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
fff0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
10000 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
10010 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
10020 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
10030 6c 65 64 22 29 3b 0a 23 69 66 64 65 66 20 53 51  led");.#ifdef SQ
10040 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
10050 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
10060 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
10070 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
10080 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
10090 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
100a0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
100b0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
100c0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
100d0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
100e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
100f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10100 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
10110 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
10120 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
10130 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
10140 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
10150 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
10160 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
10170 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
10180 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10190 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
101a0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
101b0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
101c0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
101d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
101e0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
101f0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
10200 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
10210 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
10220 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10230 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
10240 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10250 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
10260 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
10270 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
10280 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
10290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
102a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
102b0 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72  tpid());.  asser
102c0 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
102d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
102e0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
102f0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
10300 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
10310 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
10320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10330 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
10340 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
10350 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
10360 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
10370 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
10380 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
10390 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
103a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
103b0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
103c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
103d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
103e0 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
103f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66   */.  int rc = f
10400 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10410 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72  OCK_UN);.  if (r
10420 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20  c) {.    int r, 
10430 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10440 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72      r = sqliteEr
10450 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10460 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10470 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
10480 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10490 45 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20  ERROR(r) ){.    
104a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
104b0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
104c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
104d0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
104e0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66  CK_ERRORS.    if
104f0 28 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f  ( (r & SQLITE_IO
10500 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
10510 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20  OERR ){.      r 
10520 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10530 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
10540 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
10550 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
10560 2f 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72  /.    .    retur
10570 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n r;.  } else {.
10580 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
10590 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
105a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
105b0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
105c0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
105d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
105e0 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
105f0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
10600 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
10610 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10620 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LOCK);.  }.  ret
10630 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
10640 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
10650 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
10660 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
10670 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
10680 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10690 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
106a0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
106b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
106c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10720 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
10790 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
107a0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
107d0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
107e0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
107f0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
10800 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
10810 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
10820 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
10830 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
10840 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
10850 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
10860 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
10870 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
10880 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
10890 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
108a0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
108b0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
108c0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
108d0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
108e0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
108f0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
10900 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
10910 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
10920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
10930 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
10940 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10950 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
10960 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
10970 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
10980 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
10990 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
109a0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
109b0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
109c0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
109d0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
109e0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
109f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
10a00 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
10a10 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
10a20 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
10a30 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
10a40 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
10a50 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
10a60 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
10a70 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
10a80 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
10a90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10aa0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
10ab0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
10ac0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10ad0 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
10ae0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
10af0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10b00 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
10b10 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
10b20 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
10b30 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
10b40 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
10b50 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
10b60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
10b70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
10b80 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
10b90 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
10ba0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
10bb0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
10bc0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
10bd0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
10be0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
10bf0 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
10c00 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
10c10 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
10c20 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
10c30 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
10c40 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
10c50 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
10c60 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
10c70 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
10c80 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
10c90 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10ca0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10cb0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10cc0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
10cd0 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
10ce0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10cf0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10d00 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10d10 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
10d20 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
10d30 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
10d40 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
10d50 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
10d60 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20  ile->locktype < 
10d70 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
10d80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10d90 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
10da0 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
10db0 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
10dc0 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
10dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
10de0 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
10df0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
10e00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
10e10 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70  reserved);..  *p
10e20 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
10e30 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
10e40 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
10e50 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
10e60 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
10e70 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
10e80 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
10e90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10ea0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10eb0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10ec0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10ed0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10ee0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10ef0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10f00 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10f10 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10f20 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10f30 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10f40 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10f50 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10f60 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10f70 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10f80 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10f90 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10fa0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10fb0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10fc0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10fd0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10fe0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10ff0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
11000 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
11010 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
11020 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
11030 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
11040 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11050 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11060 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11070 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11080 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11090 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
110a0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
110b0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
110c0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
110d0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
110e0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
110f0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  SIVE.**.** Semap
11100 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20  hore locks only 
11110 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
11120 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
11130 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
11140 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
11150 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
11160 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
11170 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
11180 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
11190 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
111a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
111b0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
111c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
111d0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
111e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
111f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
11200 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
11210 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
11220 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11230 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
11240 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
11250 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
11260 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71  c int semLock(sq
11270 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11280 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11290 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
112a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
112b0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
112c0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
112d0 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b  le->pOpen->pSem;
112e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
112f0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
11300 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
11310 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
11320 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
11330 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
11340 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
11350 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
11360 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
11370 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
11380 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11390 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
113a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
113b0 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
113c0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
113d0 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
113e0 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
113f0 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
11400 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
11410 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
11420 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
11430 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
11440 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
11450 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
11460 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11470 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11480 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
11490 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
114a0 6f 63 6b 74 79 70 65 3b 0a 0a 20 73 65 6d 5f 65  ocktype;.. sem_e
114b0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
114c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
114d0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
114e0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
114f0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
11500 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
11510 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
11520 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
11530 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
11540 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
11550 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
11560 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11570 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
11580 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
11590 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
115a0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
115b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
115c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
115d0 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   semUnlock(sqlit
115e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
115f0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
11600 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11610 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11620 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
11630 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53  pFile->pOpen->pS
11640 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
11650 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
11660 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
11670 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
11680 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
11690 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
116a0 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46  locktype,..   pF
116b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
116c0 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65  etpid());.  asse
116d0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
116e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
116f0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11700 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11710 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
11720 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
11730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11740 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
11750 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
11760 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
11770 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
11780 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
11790 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f (locktype==SHA
117a0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
117b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
117c0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
117d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
117e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
117f0 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
11800 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
11810 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
11820 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
11830 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11850 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11860 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11870 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11880 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11890 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
118a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
118b0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
118c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
118d0 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
118e0 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
118f0 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
11900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
11910 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
11920 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
11930 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  emClose(sqlite3_
11940 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
11950 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
11960 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11970 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
11980 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   semUnlock(id, N
11990 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73  O_LOCK);.    ass
119a0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
119b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
119c0 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ();.    releaseL
119d0 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  ockInfo(pFile->p
119e0 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61  Lock);.    relea
119f0 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d  seOpenCnt(pFile-
11a00 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 63 6c 6f  >pOpen);.    clo
11a10 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11a20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
11a30 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
11a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11a50 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
11a60 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
11a70 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
11a80 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
11a90 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
11aa0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
11ab0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
11ac0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
11ad0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
11ae0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
11af0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
11bc0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
11bf0 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
11c00 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
11c10 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
11c20 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
11c30 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
11c40 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
11c50 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
11c60 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
11c70 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
11c80 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
11c90 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
11ca0 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
11cb0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
11cc0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
11cd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
11ce0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
11cf0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
11d00 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
11d10 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11d20 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
11d30 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
11d40 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
11d50 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
11d60 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
11d70 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
11d80 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
11d90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
11da0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
11db0 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
11dc0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
11dd0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
11de0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11df0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
11e00 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
11e10 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
11e20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
11e30 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
11e40 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
11e50 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
11e60 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
11e70 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
11e80 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
11e90 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
11ea0 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
11eb0 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
11ec0 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
11ed0 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
11ee0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
11ef0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
11f00 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
11f10 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
11f20 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
11f30 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
11f40 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
11f50 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
11f60 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
11f70 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
11f80 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
11fb0 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
11fc0 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
11fd0 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
11fe0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
11ff0 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
12000 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
12010 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
12020 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
12030 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
12040 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
12050 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
12060 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
12070 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
12080 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
12090 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
120a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
120b0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
120c0 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
120d0 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
120e0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
120f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
12100 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
12110 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
12120 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
12130 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
12140 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
12150 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
12160 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
12170 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
12180 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
12190 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
121a0 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
121b0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
121c0 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
121d0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
121e0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
121f0 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
12200 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
12210 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
12220 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
12230 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
12240 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
12250 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
12260 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
12270 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
12280 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
12290 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
122a0 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
122b0 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
122c0 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
122d0 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
122e0 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 36 28  ;.  .  OSTRACE6(
122f0 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
12300 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
12310 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
12320 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
12330 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
12340 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
12350 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
12360 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
12370 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65  et, length);.  e
12380 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
12390 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
123a0 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
123b0 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
123c0 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
123d0 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
123e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
123f0 53 54 52 41 43 45 34 28 22 41 46 50 53 45 54 4c  STRACE4("AFPSETL
12400 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
12410 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
12420 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12430 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
12440 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
12450 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
12460 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
12470 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
12480 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
12490 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
124a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
124b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
124e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
124f0 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
12500 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
12510 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
12520 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
12530 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
12540 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
12550 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
12560 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12570 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
12580 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
12590 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
125a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
125b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
125c0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
125d0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
125e0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
125f0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12600 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12610 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12620 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12630 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12640 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12650 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12660 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12670 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12680 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12690 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
126a0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
126b0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
126c0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
126d0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
126e0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
126f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12700 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12710 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12730 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12740 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12750 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12760 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12770 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12780 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12790 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
127a0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
127b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
127c0 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  );.  afpLockingC
127d0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
127e0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
127f0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
12800 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
12810 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
12820 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12830 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12840 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12850 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
12860 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
12870 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12880 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12890 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
128a0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
128b0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
128c0 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
128d0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
128e0 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
128f0 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
12900 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
12910 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12920 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
12930 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
12940 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12950 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
12960 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
12970 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
12980 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
12990 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
129a0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
129b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
129c0 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
129d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
129e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
129f0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
12a00 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
12a10 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
12a20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
12a30 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
12a40 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
12a50 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
12a60 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12a70 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
12a80 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12a90 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
12aa0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
12ab0 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45   .  OSTRACE4("TE
12ac0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
12ad0 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
12ae0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
12af0 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
12b00 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
12b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12b20 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
12b30 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
12b40 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
12b50 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
12b60 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
12b70 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12b80 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
12b90 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12ba0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12bb0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
12bc0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
12bd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
12be0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
12bf0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
12c00 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
12c10 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
12c20 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
12c30 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
12c40 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
12c50 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
12c60 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
12c70 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
12c80 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
12c90 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
12ca0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
12cb0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
12cc0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
12cd0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
12ce0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
12cf0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
12d00 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
12d10 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
12d20 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
12d30 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
12d40 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
12d50 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
12d60 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12d70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12d80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
12d90 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
12da0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12db0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
12dc0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
12dd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12de0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
12df0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
12e00 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
12e10 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
12e20 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
12e30 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
12e40 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
12e50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12e60 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
12e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
12e90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12ea0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
12eb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
12ec0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
12ed0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
12ee0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12ef0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
12f00 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12f10 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
12f20 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69   %d %s was %s pi
12f30 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
12f40 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  h,.         lock
12f50 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
12f60 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
12f70 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
12f80 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  ), getpid());.. 
12f90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
12fa0 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
12fb0 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
12fc0 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
12fd0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
12fe0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
12ff0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
13000 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
13010 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
13020 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13030 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
13040 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
13050 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
13060 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
13070 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  {.    OSTRACE3("
13080 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
13090 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
130a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
130b0 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
130c0 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
130d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
130e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
130f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13100 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
13110 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
13120 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13130 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
13140 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
13150 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
13160 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
13170 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
13180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
13190 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
131a0 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
131b0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
131c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
131d0 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
131e0 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
131f0 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
13200 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
13210 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
13220 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
13230 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
13240 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
13250 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
13260 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
13270 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
13280 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
13290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
132a0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
132b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
132c0 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
132d0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
132e0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
132f0 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
13300 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
13310 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
13320 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
13330 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
13340 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
13350 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
13360 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
13370 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
13380 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
13390 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
133a0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
133b0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
133c0 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
133d0 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
133e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
133f0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
13400 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13410 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
13420 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
13430 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
13440 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
13450 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
13460 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
13470 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
13480 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
13490 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
134a0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
134b0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
134c0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
134d0 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
134e0 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
134f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
13500 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
13510 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c  K ){.    int lk,
13520 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
13530 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20 20 20  1Errno;.    .   
13540 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
13550 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
13560 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
13570 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
13580 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
13590 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
135a0 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
135b0 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
135c0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74  dom(); .    cont
135d0 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ext->sharedByte 
135e0 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  = (lk & 0x7fffff
135f0 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
13600 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
13610 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13620 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13630 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
13640 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e  SHARED_FIRST+con
13650 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
13660 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
13670 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
13680 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
13690 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
136a0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
136b0 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
136c0 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
136d0 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
136e0 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
136f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13700 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
13710 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
13720 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
13730 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
13740 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
13750 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63  >lastErrno = lrc
13760 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  1Errno;.      rc
13770 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
13780 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
13790 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
137a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
137b0 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
137c0 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
137d0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
137e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
137f0 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
13800 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
13810 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
13820 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
13830 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
13840 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
13850 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
13860 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ock++;.    }.  }
13870 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
13880 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
13890 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
138a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
138b0 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
138c0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
138d0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
138e0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
138f0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
13900 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
13910 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
13920 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
13930 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  !=pFile->locktyp
13940 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63  e );.    if (loc
13950 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45  ktype >= RESERVE
13960 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
13970 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45  >locktype < RESE
13980 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
13990 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
139a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
139b0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
139c0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
139d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
139e0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
139f0 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
13a00 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
13a10 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d  d && locktype ==
13a20 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
13a30 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
13a40 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
13a50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
13a60 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
13a70 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
13a80 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
13a90 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
13aa0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
13ab0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
13ac0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
13ad0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
13ae0 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
13af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13b00 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
13b10 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
13b20 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13b30 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
13b60 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
13b70 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
13b80 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
13b90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
13ba0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
13bb0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
13bc0 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
13bd0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
13be0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
13bf0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13c00 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
13c10 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
13c40 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
13c50 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
13c60 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
13c70 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13c80 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
13cb0 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
13cc0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
13cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
13ce0 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
13cf0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
13d00 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
13d10 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
13d20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
13d30 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
13d40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13d50 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
13d60 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
13d70 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13d80 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
13d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13da0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13db0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
13dc0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
13dd0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
13de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13df0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
13e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13e10 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
13e20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
13e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
13e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13e50 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
13e60 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
13e70 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
13e80 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
13e90 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
13ea0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13eb0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
13ec0 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
13ed0 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
13ee0 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
13ef0 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
13f00 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %s %s\n", pFile
13f10 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
13f20 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
13f30 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
13f40 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
13f50 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
13f60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13f70 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13f80 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13f90 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13fa0 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
13fb0 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
13fc0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13fd0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13ff0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
14000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
14010 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
14020 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
14030 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
14040 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
14050 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14060 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
14070 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
14080 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14090 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69   locktype) {.  i
140a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
140b0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
140c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
140d0 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
140e0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
140f0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
14100 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
14110 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
14120 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14130 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
14140 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
14150 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
14160 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
14170 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69 6c  e,.         pFil
14180 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
14190 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72  pid());..  asser
141a0 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
141b0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
141c0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
141d0 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e<=locktype ){. 
141e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
141f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43  _OK;.  }.  if( C
14200 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46  HECK_THREADID(pF
14210 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ile) ){.    retu
14220 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
14230 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
14240 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  rMutex();.  if( 
14250 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
14260 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14270 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
14280 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  e->locktype==EXC
14290 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
142a0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
142b0 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74  Lock(pCtx->dbPat
142c0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
142d0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
142e0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
142f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14300 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
14310 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14320 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
14330 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
14340 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
14350 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
14360 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
14370 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
14380 52 53 54 2b 70 43 74 78 2d 3e 73 68 61 72 65 64  RST+pCtx->shared
14390 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
143a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
143b0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
143c0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
143d0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
143e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
143f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14400 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14410 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
14420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
14430 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62  SetLock(pCtx->db
14440 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
14450 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
14460 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
14470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14480 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
14490 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
144a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
144b0 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  fpSetLock(pCtx->
144c0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
144d0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
144e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
144f0 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
14500 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
14510 2f 2a 20 63 6c 65 61 72 20 74 68 65 20 73 68 61  /* clear the sha
14520 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  red lock */.    
14530 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
14540 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
14550 54 2b 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79  T+pCtx->sharedBy
14560 74 65 3b 0a 20 20 20 20 72 63 20 3d 20 61 66 70  te;.    rc = afp
14570 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62  SetLock(pCtx->db
14580 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
14590 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
145a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  0);.  }..  if( r
145b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
145c0 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
145d0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
145e0 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70     struct unixOp
145f0 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70  enCnt *pOpen = p
14600 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
14610 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
14620 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
14630 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
14640 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
14650 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26  pen->nLock==0 &&
14660 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
14670 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
14680 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
14690 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
146a0 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
146b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
146c0 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20  en->aPending[i] 
146d0 3c 20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  < 0 ) continue;.
146e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
146f0 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ose(pOpen->aPend
14700 69 6e 67 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  ing[i]) ){.     
14710 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14720 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
14730 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
14740 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
14750 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20  LOSE;.          
14760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14770 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
14780 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  ng[i] = -1;.    
14790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
147a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
147b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
147c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
147d0 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65  _free(pOpen->aPe
147e0 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  nding);.        
147f0 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
14800 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
14810 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
14820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14840 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
14850 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
14860 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
14870 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
14880 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
14890 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
148a0 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
148b0 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
148c0 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
148d0 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
148e0 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
148f0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
14900 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
14910 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14920 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14930 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
14940 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
14950 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
14960 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
14970 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e  pOpen && pFile->
14980 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  pOpen->nLock ){.
14990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
149a0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
149b0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
149c0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
149d0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
149e0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
149f0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
14a00 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
14a10 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
14a20 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
14a30 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
14a40 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
14a50 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
14a60 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
14a70 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
14a80 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
14a90 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
14aa0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
14ab0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75  ;.      struct u
14ac0 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
14ad0 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
14ae0 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73  ;.      aNew = s
14af0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
14b00 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20  Open->aPending, 
14b10 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  (pOpen->nPending
14b20 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  +1)*sizeof(int) 
14b30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
14b40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
14b50 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66  /* If a malloc f
14b60 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20  ails, just leak 
14b70 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
14b80 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  tor */.      }el
14b90 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  se{.        pOpe
14ba0 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e  n->aPending = aN
14bb0 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  ew;.        pOpe
14bc0 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65  n->aPending[pOpe
14bd0 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70  n->nPending] = p
14be0 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20  File->h;.       
14bf0 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
14c00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  ++;.        pFil
14c10 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
14c20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c   }.    }.    rel
14c30 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c  easeOpenCnt(pFil
14c40 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73  e->pOpen);.    s
14c50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
14c60 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
14c70 74 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  t);.    closeUni
14c80 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14c90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
14cc0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
14cd0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
14ce0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
14cf0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
14d00 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
14d10 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
14d20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
14d30 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
14d40 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
14d50 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
14d60 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
14d70 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
14d80 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
14d90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
14da0 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
14db0 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
14dc0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
14dd0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
14de0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
14df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e00 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14e10 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
14e20 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14e90 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ee0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14ef0 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
14f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
14f10 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
14f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f30 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
14f40 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
14f50 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
14f60 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
14f70 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
14f80 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
14f90 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
14fa0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
14fb0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
14fc0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
14fd0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
14fe0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
14ff0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
15000 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
15010 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
15020 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
15030 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
15040 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
15050 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
15060 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
15070 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
15080 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
15090 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
150a0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
150b0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
150c0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
150d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
150e0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
150f0 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
15100 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
15110 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
15120 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
15130 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
15140 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
15150 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
15160 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
15170 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
15180 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
15190 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
151a0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
151b0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
151c0 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
151d0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
151e0 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
151f0 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
15200 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
15210 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
15220 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
15230 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
15240 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
15250 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
15260 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
15270 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
15280 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
15290 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
152a0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
152b0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
152c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
152d0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
152e0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
152f0 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f   got;.  i64 newO
15300 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53  ffset;.  TIMER_S
15310 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
15320 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
15330 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
15340 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
15350 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
15360 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
15370 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
15380 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
15390 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
153a0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
153b0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
153c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
153d0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
153e0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
153f0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
15400 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
15410 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15420 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
15430 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
15440 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
15450 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
15460 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
15470 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
15480 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
154a0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
154b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
154c0 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
154d0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
154e0 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c  ot = read(id->h,
154f0 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
15500 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
15510 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
15520 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
15530 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15540 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53   errno;.  }.  OS
15550 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20 20  TRACE5("READ    
15560 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
15570 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
15580 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
15590 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
155a0 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
155b0 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
155c0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
155d0 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
155e0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
155f0 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
15600 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
15610 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
15620 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
15630 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
15640 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
15650 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
15660 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
15670 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
15680 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
15690 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
156a0 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
156b0 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  t( id );..  /* N
156c0 65 76 65 72 20 72 65 61 64 20 6f 72 20 77 72 69  ever read or wri
156d0 74 65 20 61 6e 79 20 6f 66 20 74 68 65 20 62 79  te any of the by
156e0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
156f0 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  ng range */.  as
15700 73 65 72 74 28 20 28 28 75 6e 69 78 46 69 6c 65  sert( ((unixFile
15710 2a 29 69 64 29 2d 3e 69 73 4c 6f 63 6b 61 62 6c  *)id)->isLockabl
15720 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  e==0.          |
15730 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
15740 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
15750 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
15760 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
15770 20 29 3b 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65   );..  got = see
15780 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
15790 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20  le*)id, offset, 
157a0 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
157b0 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
157c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
157d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
157e0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
157f0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
15800 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
15810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15820 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
15830 7d 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e 69  }else{.    ((uni
15840 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15850 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
15860 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
15870 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
15880 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
15890 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
158a0 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
158b0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
158c0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
158d0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
158e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
158f0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
15900 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
15910 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
15920 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
15930 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
15940 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
15950 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
15960 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
15970 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
15980 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
15990 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
159a0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
159b0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
159c0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
159d0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
159e0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
159f0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
15a00 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
15a10 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
15a20 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
15a30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
15a40 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
15a50 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
15a60 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
15a70 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
15a80 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
15a90 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70   pwrite(id->h, p
15aa0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
15ab0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
15ac0 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
15ad0 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69  got = pwrite64(i
15ae0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
15af0 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a   offset);.#else.
15b00 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
15b10 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
15b20 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
15b30 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
15b40 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
15b50 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
15b60 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
15b70 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
15b80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
15b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
15ba0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
15bb0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
15bc0 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
15bd0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
15be0 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
15bf0 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
15c00 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
15c10 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
15c20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
15c30 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
15c40 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53  errno;.  }..  OS
15c50 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
15c60 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
15c70 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
15c80 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
15c90 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
15ca0 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
15cb0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
15cc0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
15cd0 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
15ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15cf0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
15d00 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
15d10 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
15d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
15d30 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
15d40 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
15d50 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
15d60 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
15d70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
15d80 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72  set .){.  int wr
15d90 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
15da0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
15db0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
15dc0 2a 20 4e 65 76 65 72 20 72 65 61 64 20 6f 72 20  * Never read or 
15dd0 77 72 69 74 65 20 61 6e 79 20 6f 66 20 74 68 65  write any of the
15de0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
15df0 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
15e00 20 61 73 73 65 72 74 28 20 28 28 75 6e 69 78 46   assert( ((unixF
15e10 69 6c 65 2a 29 69 64 29 2d 3e 69 73 4c 6f 63 6b  ile*)id)->isLock
15e20 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  able==0.        
15e30 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
15e40 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
15e50 20 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65          || offse
15e60 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
15e70 59 54 45 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  YTE );..#ifndef 
15e80 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  NDEBUG.  /* If w
15e90 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
15ea0 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
15eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
15ec0 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
15ed0 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
15ee0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
15ef0 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
15f00 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
15f10 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
15f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
15f30 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
15f40 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
15f50 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
15f60 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
15f70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
15f80 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
15f90 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
15fa0 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
15fb0 0a 20 20 69 66 28 20 28 28 75 6e 69 78 46 69 6c  .  if( ((unixFil
15fc0 65 2a 29 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c  e*)id)->inNormal
15fd0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 75 6e 69  Write ){.    uni
15fe0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15ff0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16000 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
16010 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
16020 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
16030 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
16040 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
16050 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
16060 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
16070 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
16080 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
16090 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
160a0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
160b0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
160c0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
160d0 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
160e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
160f0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
16100 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
16110 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
16120 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
16130 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
16140 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
16150 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
16160 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
16170 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
16180 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
16190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
161a0 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
161b0 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
161c0 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
161d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66  unixFile*)id, of
161e0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
161f0 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
16200 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
16210 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
16220 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
16230 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
16240 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
16250 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
16260 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
16270 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
16280 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
16290 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28   amt=1 ));.  if(
162a0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
162b0 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20  ( wrote<0 ){.   
162c0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
162d0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
162e0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
162f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16300 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
16310 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
16320 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
16330 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
16340 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
16350 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
16360 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
16370 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
16380 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
16390 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
163a0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
163b0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
163c0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
163d0 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
163e0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
163f0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
16400 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
16410 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
16420 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
16430 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
16440 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
16450 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
16460 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16470 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  ./*.** Use the f
16480 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f  datasync() API o
16490 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f  nly if the HAVE_
164a0 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20  FDATASYNC macro 
164b0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f  is defined..** O
164c0 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79  therwise use fsy
164d0 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63  nc() in its plac
164e0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41  e..*/.#ifndef HA
164f0 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
16500 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
16510 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
16520 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
16530 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
16540 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
16550 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
16560 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
16570 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
16580 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
16590 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
165a0 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
165b0 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
165c0 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
165d0 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
165e0 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
165f0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
16600 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
16610 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
16620 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
16630 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
16640 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
16650 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
16660 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
16670 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
16680 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
16690 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
166a0 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
166b0 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
166c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
166d0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
166e0 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
166f0 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
16700 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
16710 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
16720 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
16730 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
16740 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
16750 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
16760 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
16770 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
16780 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
16790 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
167a0 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
167b0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
167c0 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
167d0 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
167e0 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
167f0 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
16800 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16810 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
16820 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
16830 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
16840 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
16850 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
16860 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
16870 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
16880 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
16890 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
168a0 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
168b0 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
168c0 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
168d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
168e0 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
168f0 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
16900 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
16910 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
16920 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
16930 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
16940 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
16950 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
16960 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
16970 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
16980 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
16990 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
169a0 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
169b0 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
169c0 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
169d0 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
169e0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
169f0 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
16a00 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
16a10 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
16a20 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
16a30 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
16a40 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
16a50 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
16a60 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
16a70 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
16a80 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
16a90 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
16aa0 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
16ab0 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
16ac0 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
16ad0 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
16ae0 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
16af0 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
16b00 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
16b10 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
16b20 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
16b30 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
16b40 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
16b50 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
16b60 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
16b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
16b80 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
16b90 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
16ba0 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
16bb0 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
16bc0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
16bd0 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
16be0 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
16bf0 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
16c00 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
16c10 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
16c20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
16c30 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
16c40 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
16c50 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
16c60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
16c70 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
16c80 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
16c90 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
16ca0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
16cb0 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
16cc0 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
16cd0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
16ce0 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
16cf0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
16d00 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
16d10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
16d20 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
16d30 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
16d40 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
16d50 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
16d60 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
16d70 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
16d80 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
16d90 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
16da0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
16db0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
16dc0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
16dd0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
16de0 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
16df0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16e00 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
16e10 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
16e20 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
16e30 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
16e40 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
16e50 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
16e60 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
16e70 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
16e80 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
16e90 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
16ea0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
16eb0 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
16ec0 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
16ed0 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
16ee0 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
16ef0 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
16f00 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
16f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
16f20 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
16f30 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
16f40 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
16f50 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
16f60 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
16f70 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
16f80 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
16f90 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
16fa0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
16fb0 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
16fc0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
16fd0 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
16fe0 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
16ff0 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
17000 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
17010 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
17020 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
17030 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
17040 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
17050 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
17060 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
17070 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
17080 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
17090 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
170a0 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
170b0 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
170c0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
170d0 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
170e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
170f0 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
17100 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 72 63  d);..#else .  rc
17110 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
17120 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
17130 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26  .  if( rc==-1 &&
17140 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20   errno==ENOTSUP 
17150 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  ){.    rc = fsyn
17160 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
17170 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
17180 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  */.#endif /* ifd
17190 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
171a0 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  C elif HAVE_FULL
171b0 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20  FSYNC */..  if( 
171c0 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63  OS_VXWORKS && rc
171d0 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  != -1 ){.    rc 
171e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
171f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
17200 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
17210 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
17220 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
17230 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
17240 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
17250 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
17260 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
17270 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
17280 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
17290 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
172a0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
172b0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
172c0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
172d0 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
172e0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
172f0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
17300 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
17310 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
17320 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
17330 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
17340 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
17350 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
17360 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
17370 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
17380 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
17390 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
173a0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
173b0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
173c0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
173d0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
173e0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
173f0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
17400 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
17410 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
17420 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
17430 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
17440 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
17450 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
17460 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
17470 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
17480 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
17490 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
174a0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
174b0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
174c0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
174d0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
174e0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
174f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17500 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
17510 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
17520 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17530 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
17540 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
17550 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
17560 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
17570 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
17580 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17590 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
175a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
175b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
175c0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
175d0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
175e0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
175f0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17600 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
17610 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
17620 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
17630 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
17640 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
17650 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
17660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
17670 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
17680 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
17690 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
176a0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
176b0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
176c0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
176d0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
176e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
176f0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
17700 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
17710 41 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE2("SYNC    %-
17720 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
17730 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
17740 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
17750 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
17760 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
17770 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
17780 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17790 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
177a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
177b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
177c0 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20  ERR_FSYNC;.  }. 
177d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
177e0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  d>=0 ){.    int 
177f0 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  err;.    OSTRACE
17800 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  4("DIRSYNC %-3d 
17810 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
17820 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
17830 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  n", pFile->dirfd
17840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
17850 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
17860 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64  Fullsync);.#ifnd
17870 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
17880 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
17890 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
178a0 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
178b0 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
178c0 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
178d0 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
178e0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
178f0 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
17900 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
17910 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
17920 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
17930 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
17940 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
17950 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
17960 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
17970 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
17980 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
17990 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
179a0 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
179b0 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
179c0 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
179d0 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
179e0 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
179f0 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
17a00 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
17a10 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
17a20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
17a30 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
17a40 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
17a50 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
17a60 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
17a70 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
17a80 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
17a90 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
17aa0 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61      /* pFile->la
17ab0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
17ac0 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
17ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17ae0 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
17af0 69 66 0a 20 20 20 20 65 72 72 20 3d 20 63 6c 6f  if.    err = clo
17b00 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
17b10 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74  ; /* Only need t
17b20 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
17b30 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20 20 20  close the */.   
17b40 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 20 20   if( err==0 ){  
17b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
17b60 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65  irectory when we
17b70 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20   are done */.   
17b80 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
17b90 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
17ba0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
17bb0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
17bc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17bd0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
17be0 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SE;.    }.  }.  
17bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17c00 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
17c10 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
17c20 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
17c30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17c40 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
17c50 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
17c60 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Byte){.  int rc;
17c70 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17c80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17c90 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17ca0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
17cb0 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e   );.  rc = ftrun
17cc0 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a  cate(((unixFile*
17cd0 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29  )id)->h, (off_t)
17ce0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
17cf0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
17d00 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
17d10 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
17d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17d30 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20  ERR_TRUNCATE;.  
17d40 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
17d70 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
17d80 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
17d90 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
17da0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
17db0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
17dc0 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
17dd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
17de0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
17df0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
17e00 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e   rc = fstat(((un
17e10 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
17e20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
17e30 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
17e40 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
17e50 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
17e60 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
17e70 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
17e80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17e90 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70  _FSTAT;.  }.  *p
17ea0 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69  Size = buf.st_si
17eb0 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f  ze;..  /* When o
17ec0 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69  pening a zero-si
17ed0 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ze database, the
17ee0 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20   findLockInfo() 
17ef0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
17f00 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
17f10 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
17f20 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
17f30 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
17f40 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
17f50 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
17f60 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
17f70 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
17f80 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
17f90 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
17fa0 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
17fb0 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
17fc0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
17fd0 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
17fe0 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
17ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
18000 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
18010 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
18020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
18030 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18040 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
18050 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18060 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
18070 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
18080 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
18090 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
180a0 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
180b0 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
180c0 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
180d0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
180e0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
180f0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
18100 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d*);.#endif.../*
18110 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
18120 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
18130 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
18140 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
18150 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
18160 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
18170 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
18180 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
18190 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
181a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
181b0 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
181c0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
181d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
181e0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
181f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18200 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18210 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
18220 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
18230 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69  nt*)pArg = ((uni
18240 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18250 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
18260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18270 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
18280 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
18290 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
182a0 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
182b0 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
182c0 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
182d0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
182e0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
182f0 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
18300 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
18310 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
18320 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
18330 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
18340 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
18350 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
18360 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18370 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
18380 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
18390 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
183a0 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
183b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
183c0 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
183d0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
183e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
183f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
18400 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
18410 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
18420 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
18430 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
18440 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
18450 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
18460 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
18470 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
18480 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18490 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
184a0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
184b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20  __APPLE__) */.  
184c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
184d0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
184e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
184f0 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
18500 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
18510 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
18520 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
18530 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
18540 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
18550 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
18560 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
18570 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
18580 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
18590 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
185a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
185b0 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
185c0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
185d0 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
185e0 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
185f0 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
18600 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
18610 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
18620 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
18630 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
18640 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
18650 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
18660 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
18670 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
18680 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
18690 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
186a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
186b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
186c0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
186d0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
186e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
186f0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
18700 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
18710 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
18720 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e   always 0 for un
18730 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ix..*/.static in
18740 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
18750 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
18760 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
18770 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
18780 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
18790 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
187a0 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
187b0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
187c0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
187d0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
187e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
187f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
18800 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
18810 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
18820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18830 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18880 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
18890 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
188a0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
188b0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
188c0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
188d0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
188e0 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
188f0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
18900 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
18910 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
18920 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
18930 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
18940 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
18950 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
18960 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
18970 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
18980 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
18990 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
189a0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
189b0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
189c0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
189d0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
189e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
189f0 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
18a00 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
18a10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
18a20 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
18a30 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
18a40 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
18a50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
18a60 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
18a70 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
18a80 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
18a90 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
18aa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
18ab0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
18ac0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
18ad0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
18ae0 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
18af0 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
18b00 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
18b10 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
18b20 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
18b30 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
18b40 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
18b50 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
18b60 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
18b70 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
18b80 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
18b90 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
18ba0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
18bb0 69 73 20 66 75 6e 63 74 69 6f 20 6e 61 6d 65 64  is functio named
18bc0 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
18bd0 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
18be0 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
18bf0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
18c00 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
18c10 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
18c20 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
18c30 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
18c40 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
18c50 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
18c60 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
18c70 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
18c80 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
18c90 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
18ca0 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
18cb0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
18cc0 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
18cd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
18ce0 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
18cf0 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
18d00 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
18d10 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
18d20 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
18d30 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
18d40 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
18d50 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
18d60 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
18d70 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
18d80 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
18d90 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
18da0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
18db0 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
18dc0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
18dd0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
18de0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
18df0 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
18e00 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
18e10 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
18e20 4f 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  OD, CLOSE, LOCK,
18e30 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18e50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
18e60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
18e70 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
18ea0 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ec0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18ef0 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f10 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18f40 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f60 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
18f90 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18fb0 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
18fe0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
18ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
19000 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
19030 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
19040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
19050 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
19080 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
19090 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
190a0 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
190d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
190e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
190f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
19120 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
19130 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
19140 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
19170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19180 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
19190 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
191c0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
191d0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
191e0 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
19210 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
19220 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
19230 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
19260 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19270 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70     /* xDeviceCap
19280 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
19300 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
19310 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
19320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
19330 6e 74 20 68 29 7b 20 20 20 20 20 20 20 20 20 5c  nt h){         \
19340 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19350 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
19360 41 52 41 4d 45 54 45 52 28 68 29 3b 20 20 20 20  ARAMETER(h);    
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
19390 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
193a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
19430 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
19440 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
19450 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
19460 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 20  onst char*,int) 
19470 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19480 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
19490 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
194a0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
194b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
194c0 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
194d0 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
194e0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
194f0 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
19500 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
19510 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
19520 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
19530 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
19540 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
19550 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
19560 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
19570 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
19580 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
19590 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
195a0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
195b0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78  t name */.  unix
195c0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
195d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
195e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
195f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
19600 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
19610 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
19620 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
19630 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
19640 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
19650 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19660 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k     /* xCheckR
19670 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
19680 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
19690 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
196a0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
196b0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
196c0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
196d0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
196e0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
196f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
19700 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  ct name */.  nol
19710 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
19720 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
19730 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
19740 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
19750 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
19760 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
19770 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
19780 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
19790 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
197a0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
197b0 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
197c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
197d0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
197e0 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
197f0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
19800 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
19810 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
19820 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
19830 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
19840 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
19850 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ect name */.  do
19860 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
19870 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
19880 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
19890 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
198a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
198b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
198c0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
198d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
198e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
198f0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
19900 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
19910 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
19920 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
19930 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
19940 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
19950 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
19960 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
19970 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
19980 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
19990 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
199a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
199b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
199c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
199d0 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
199e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
199f0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
19a00 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
19a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
19a20 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
19a30 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
19a40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
19a50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
19a60 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
19a70 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
19a80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
19a90 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
19aa0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
19ab0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
19ac0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
19ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
19ae0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
19af0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
19b00 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
19b10 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
19b20 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
19b30 6d 65 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  me */.  semClose
19b40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19b50 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
19b60 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
19b90 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
19ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19bb0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
19bc0 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
19bd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
19be0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
19bf0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
19c00 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
19c10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19c20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19c30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19c40 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
19c50 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
19c60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
19c70 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
19c80 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
19c90 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
19ca0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
19cb0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
19cc0 65 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  e */.  afpClose,
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
19cf0 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
19d20 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
19d50 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
19d60 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
19d70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
19d80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
19d90 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
19da0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
19db0 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
19dc0 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
19dd0 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
19de0 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
19df0 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
19e00 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
19e10 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
19e20 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
19e30 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
19e40 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
19e50 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
19e60 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
19e70 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
19e80 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
19e90 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
19ea0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
19eb0 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
19ec0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
19ed0 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
19ee0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
19ef0 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
19f00 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
19f10 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
19f20 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
19f30 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
19f40 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
19f50 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
19f60 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
19f70 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
19f80 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
19f90 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
19fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19fb0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
19fc0 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
19fd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
19fe0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
19ff0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1a000 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
1a010 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
1a020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1a030 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1a040 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
1a050 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1a060 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
1a070 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
1a080 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1a090 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1a0a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1a0b0 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
1a0c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
1a0d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1a0e0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1a0f0 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20  .  proxyClose,  
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a110 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1a120 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20  .  proxyLock,   
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a140 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1a150 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20    proxyUnlock,  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a170 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1a180 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  .  proxyCheckRes
1a190 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
1a1a0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1a1b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1a1c0 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69  endif...#if defi
1a1d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1a1e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1a1f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
1a200 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
1a210 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
1a220 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
1a230 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
1a240 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
1a250 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1a260 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
1a270 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
1a280 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
1a290 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1a2a0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
1a2b0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
1a2c0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
1a2d0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
1a2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1a2f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1a300 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
1a310 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
1a320 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
1a330 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
1a340 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a350 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20  ile */.  int fd 
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 72 69    /* file descri
1a380 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
1a390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1a3a0 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
1a3b0 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
1a3c0 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
1a3d0 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
1a3e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a3f0 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
1a400 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
1a410 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1a420 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
1a430 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
1a440 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
1a450 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
1a460 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
1a470 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
1a480 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
1a490 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
1a4a0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1a4b0 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
1a4c0 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 69 66 64 65  Methods },.#ifde
1a4d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a4e0 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a  AFP_LOCKING_SMB.
1a4f0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
1a500 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
1a510 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d  .#else.    { "sm
1a520 62 66 73 22 2c 20 20 26 66 6c 6f 63 6b 49 6f 4d  bfs",  &flockIoM
1a530 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6e 64 69 66  ethods },.#endif
1a540 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
1a550 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1a560 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
1a570 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
1a580 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
1a590 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
1a5a0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
1a5b0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
1a5c0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
1a5d0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
1a5e0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
1a5f0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
1a600 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
1a610 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1a620 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
1a630 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
1a640 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
1a650 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
1a660 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
1a670 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
1a680 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
1a690 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
1a6a0 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
1a6b0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
1a6c0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
1a6d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
1a6e0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
1a6f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1a700 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
1a710 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
1a720 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
1a730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1a740 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
1a750 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
1a760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a770 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
1a780 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
1a790 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
1a7a0 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
1a7b0 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
1a7c0 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
1a7d0 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
1a7e0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
1a7f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
1a800 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
1a810 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
1a820 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
1a830 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
1a840 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
1a850 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
1a860 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1a870 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
1a880 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
1a890 66 28 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  f( fcntl(fd, F_G
1a8a0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
1a8b0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
1a8c0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
1a8d0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
1a8e0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
1a8f0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
1a900 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
1a910 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1a920 73 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c  s *(*const autol
1a930 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
1a940 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 0a 20 20  st char*,int).  
1a950 20 20 20 20 20 20 3d 20 61 75 74 6f 6c 6f 63 6b        = autolock
1a960 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
1a970 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1a980 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1a990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1a9a0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
1a9b0 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
1a9c0 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
1a9d0 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68  ter to a IO meth
1a9e0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
1a9f0 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
1aa00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1aa10 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
1aa20 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
1aa30 61 72 2a 2c 69 6e 74 29 3b 0a 0a 0a 2f 2a 2a 2a  ar*,int);.../***
1aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaa0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1aab0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aad0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1aae0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1aaf0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1ab00 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1ab10 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1ab20 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1ab30 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
1ab40 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
1ab50 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
1ab60 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
1ab70 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
1ab80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1ab90 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
1aba0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1abb0 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
1abc0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
1abd0 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abf0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
1ac00 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
1ac10 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
1ac20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20  int dirfd,      
1ac30 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
1ac40 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1ac50 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
1ac60 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
1ac70 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
1ac80 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1ac90 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1aca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1acb0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
1acc0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
1acd0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
1ace0 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20   noLock,        
1acf0 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63       /* Omit loc
1ad00 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  king if true */.
1ad10 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1ad20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1ad30 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20  ete on close if 
1ad40 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  true */.){.  con
1ad50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1ad60 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
1ad70 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
1ad80 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
1ad90 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
1ada0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1adb0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1adc0 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a  >pLock==NULL );.
1add0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1ade0 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  pOpen==NULL );..
1adf0 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
1ae00 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
1ae10 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
1ae20 0a 20 20 2a 2a 20 45 78 70 72 65 73 73 20 74 68  .  ** Express th
1ae30 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 68 65  is explicitly he
1ae40 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f  re to prevent co
1ae50 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a  mpiler warnings.
1ae60 20 20 2a 2a 20 61 62 6f 75 74 20 75 6e 75 73 65    ** about unuse
1ae70 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
1ae80 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
1ae90 4b 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  KS.  UNUSED_PARA
1aea0 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
1aeb0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
1aec0 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE3("OPEN    %-3
1aed0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
1aee0 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e  ename);    .  pN
1aef0 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
1af00 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
1af10 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
1af20 28 70 4e 65 77 29 3b 0a 0a 23 69 66 20 4f 53 5f  (pNew);..#if OS_
1af30 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
1af40 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
1af50 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
1af60 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
1af70 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f  pId==0 ){.    no
1af80 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63  Lock = 1;.    rc
1af90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1afa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1afb0 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( noLock ){.   
1afc0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1afd0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1afe0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
1aff0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
1b000 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a  (**(finder_type*
1b010 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  )pVfs->pAppData)
1b020 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a  (zFilename, h);.
1b030 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1b040 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1b050 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
1b060 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
1b070 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
1b080 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
1b090 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
1b0a0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
1b0b0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
1b0c0 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
1b0d0 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
1b0e0 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
1b0f0 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
1b100 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
1b110 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
1b120 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
1b130 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
1b140 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
1b150 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
1b160 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
1b170 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
1b180 78 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  xIoMethods ){.  
1b190 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1b1a0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1b1b0 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1b1c0 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1b1d0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1b1e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1b1f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
1b200 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1b210 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1b220 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1b230 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
1b240 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
1b250 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1b260 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
1b270 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
1b280 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
1b290 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
1b2a0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
1b2b0 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
1b2c0 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
1b2d0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
1b2e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
1b2f0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
1b300 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1b310 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
1b320 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
1b330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1b340 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b360 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
1b370 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
1b380 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
1b390 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
1b3a0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
1b3b0 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
1b3c0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
1b3d0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
1b3e0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
1b3f0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
1b400 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
1b410 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
1b420 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
1b430 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
1b440 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
1b450 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
1b460 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
1b470 28 70 4e 65 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e  (pNew, NULL, &pN
1b480 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ew->pOpen);.    
1b490 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1b4a0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
1b4b0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1b4c0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
1b4d0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
1b4e0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
1b4f0 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
1b500 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1b510 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1b520 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
1b530 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
1b540 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
1b550 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
1b560 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
1b570 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
1b580 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c  lename;.    nFil
1b590 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
1b5a0 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
1b5b0 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
1b5c0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
1b5d0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
1b5e0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
1b5f0 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  LockFile==0 ){. 
1b600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b610 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1b620 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1b630 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
1b640 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
1b650 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
1b660 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
1b670 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
1b680 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1b690 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
1b6a0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1b6b0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
1b6c0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
1b6d0 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
1b6e0 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
1b6f0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
1b700 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
1b710 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
1b720 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
1b730 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
1b740 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
1b750 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
1b760 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
1b770 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1b780 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ew, &pNew->pLock
1b790 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b  , &pNew->pOpen);
1b7a0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1b7b0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
1b7c0 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d  w->pOpen->pSem==
1b7d0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
1b7e0 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
1b7f0 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65  pNew->pOpen->aSe
1b800 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
1b810 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
1b820 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1b830 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
1b840 65 2c 20 22 25 73 2e 73 65 6d 22 2c 0a 20 20 20  e, "%s.sem",.   
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
1b870 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
1b880 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b 20        for( n=0; 
1b890 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
1b8a0 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
1b8b0 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
1b8c0 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
1b8d0 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
1b8e0 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73  >pOpen->pSem = s
1b8f0 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
1b900 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
1b910 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1b920 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  New->pOpen->pSem
1b930 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
1b940 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1b950 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b960 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e       pNew->pOpen
1b970 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
1b980 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
1b990 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
1b9a0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
1b9b0 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e  ndif.  .  pNew->
1b9c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23  lastErrno = 0;.#
1b9d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1b9e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b9f0 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  K ){.    unlink(
1ba00 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1ba10 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20  isDelete = 0;.  
1ba20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65  }.  pNew->isDele
1ba30 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23  te = isDelete;.#
1ba40 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
1ba50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ba60 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20   if( dirfd>=0 ) 
1ba70 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
1ba80 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20   silent leak if 
1ba90 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e  fail, already in
1baa0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
1bab0 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  ose(h);.  }else{
1bac0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
1bad0 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
1bae0 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
1baf0 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72  ter(+1);.  }.  r
1bb00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bb10 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1bb20 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1bb30 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1bb40 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1bb50 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1bb60 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1bb70 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1bb80 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1bb90 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1bba0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1bbb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1bbc0 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1bbd0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1bbe0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1bbf0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1bc00 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1bc10 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1bc20 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ue..**.** If SQL
1bc30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1bc40 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1bc50 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1bc60 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1bc70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1bc80 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1bc90 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1bca0 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1bcb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1bcc0 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1bcd0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1bce0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1bcf0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1bd00 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1bd10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1bd20 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1bd30 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1bd40 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1bd50 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1bd60 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1bd70 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1bd80 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1bd90 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1bda0 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1bdb0 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  0';.    fd = ope
1bdc0 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
1bdd0 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
1bde0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  );.    if( fd>=0
1bdf0 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c   ){.#ifdef FD_CL
1be00 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63 6e 74  OEXEC.      fcnt
1be10 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66  l(fd, F_SETFD, f
1be20 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
1be30 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
1be40 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
1be50 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 44   OSTRACE3("OPEND
1be60 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1be70 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
1be80 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1be90 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1bea0 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53  d>=0?SQLITE_OK:S
1beb0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b  QLITE_CANTOPEN);
1bec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1bed0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1bee0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
1bef0 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
1bf00 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
1bf10 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
1bf20 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
1bf30 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
1bf40 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
1bf50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
1bf60 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
1bf70 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69  nt getTempname(i
1bf80 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1bf90 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
1bfa0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
1bfb0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
1bfc0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
1bfd0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
1bfe0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
1bff0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c  /tmp",.     ".",
1c000 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
1c010 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c020 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
1c030 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
1c040 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
1c050 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
1c060 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
1c070 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
1c080 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
1c090 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20   i, j;.  struct 
1c0a0 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
1c0b0 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22  t char *zDir = "
1c0c0 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .";..  /* It's o
1c0d0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
1c0e0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
1c0f0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
1c100 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
1c110 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
1c120 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
1c130 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
1c140 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
1c150 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
1c160 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
1c170 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1c180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c190 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72  OERR );..  azDir
1c1a0 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
1c1b0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
1c1c0 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44   if (NULL == azD
1c1d0 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a  irs[1]) {.    az
1c1e0 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
1c1f0 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a  ("TMPDIR");.  }.
1c200 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c    .  for(i=0; i<
1c210 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
1c220 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
1c230 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1c240 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
1c250 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1c260 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
1c270 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
1c280 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
1c290 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
1c2a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c2b0 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
1c2c0 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
1c2d0 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
1c2e0 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
1c2f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
1c300 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
1c310 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
1c320 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
1c330 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
1c340 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
1c350 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
1c360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1c370 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
1c380 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
1c390 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
1c3a0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
1c3b0 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74  + 17) >= (size_t
1c3c0 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74  )nBuf ){.    ret
1c3d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1c3e0 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
1c3f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1c400 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c  f(nBuf-17, zBuf,
1c410 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
1c420 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
1c430 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69  Dir);.    j = (i
1c440 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b  nt)strlen(zBuf);
1c450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
1c460 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
1c470 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
1c480 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
1c490 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
1c4a0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
1c4b0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
1c4c0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
1c4d0 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
1c4e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
1c4f0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
1c500 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
1c510 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
1c520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1c530 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1c540 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1c550 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1c560 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
1c570 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
1c580 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
1c590 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
1c5a0 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
1c5b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
1c5c0 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
1c5d0 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
1c5e0 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
1c5f0 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
1c600 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
1c610 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
1c620 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1c630 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
1c640 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
1c650 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
1c660 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  f.../*.** Open t
1c670 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
1c680 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
1c690 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
1c6a0 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
1c6b0 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
1c6c0 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
1c6d0 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
1c6e0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
1c6f0 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
1c700 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
1c710 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
1c720 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
1c730 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
1c740 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
1c750 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
1c760 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
1c770 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
1c780 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
1c790 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
1c7a0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
1c7b0 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
1c7c0 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
1c7d0 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
1c7e0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
1c7f0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
1c800 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
1c810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
1c820 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
1c830 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
1c840 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
1c850 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
1c860 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
1c870 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
1c880 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1c890 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1c8a0 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
1c8b0 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
1c8c0 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
1c8d0 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
1c8e0 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
1c8f0 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
1c900 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
1c910 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
1c920 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
1c930 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
1c940 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1c950 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1c960 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1c970 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
1c980 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
1c990 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
1c9a0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
1c9b0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
1c9c0 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
1c9d0 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
1c9e0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
1c9f0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1ca00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ca10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1ca20 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
1ca30 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
1ca60 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
1ca70 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
1ca80 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
1ca90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
1caa0 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
1cab0 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
1cac0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20   */.){.  int fd 
1cad0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1cae0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1caf0 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
1cb00 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
1cb10 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d  .  int dirfd = -
1cb20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1cb30 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
1cb40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1cb50 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
1cb60 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
1cb70 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
1cb80 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
1cb90 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
1cba0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
1cbb0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
1cbc0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1cbd0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cbf0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
1cc00 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
1cc10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1cc20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74  QLITE_OK;..  int
1cc30 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
1cc40 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1cc50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
1cc60 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
1cc70 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
1cc80 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1cc90 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
1cca0 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
1ccb0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1ccc0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
1ccd0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
1cce0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1ccf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1cd00 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
1cd10 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
1cd20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1cd30 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  DWRITE);..  /* I
1cd40 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
1cd50 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
1cd60 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
1cd70 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
1cd80 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
1cd90 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
1cda0 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
1cdb0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
1cdc0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
1cdd0 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
1cde0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1cdf0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
1ce00 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
1ce10 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
1ce20 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
1ce30 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
1ce40 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53  .      (eType==S
1ce50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1ce60 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  R_JOURNAL || eTy
1ce70 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ce80 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
1ce90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
1cea0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
1ceb0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
1cec0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
1ced0 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
1cee0 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
1cef0 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
1cf00 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
1cf10 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
1cf20 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
1cf30 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
1cf40 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+1];.  const 
1cf50 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
1cf60 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
1cf70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1cf80 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
1cf90 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
1cfa0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
1cfb0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
1cfc0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
1cfd0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
1cfe0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
1cff0 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
1d000 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
1d010 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1d020 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
1d030 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
1d040 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1d050 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1d060 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
1d070 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
1d080 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
1d090 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1d0a0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
1d0b0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
1d0c0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
1d0d0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
1d0e0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
1d0f0 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
1d100 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
1d110 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
1d120 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
1d130 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
1d140 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
1d150 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
1d160 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
1d170 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
1d180 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61   journal, and ma
1d190 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
1d1a0 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63   never automatic
1d1b0 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65  ally.  ** delete
1d1c0 64 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  d.  */.  assert(
1d1d0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
1d1e0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c 20 21  PEN_MAIN_DB || !
1d1f0 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73  isDelete );.  as
1d200 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c  sert( eType!=SQL
1d210 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1d220 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65  URNAL || !isDele
1d230 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
1d240 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1d250 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1d260 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29  L || !isDelete )
1d270 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1d280 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
1d290 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
1d2a0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
1d2b0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
1d2c0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
1d2d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1d2e0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
1d2f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
1d300 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
1d310 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1d320 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1d330 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1d340 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1d350 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
1d360 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d370 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
1d380 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1d390 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1d3a0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
1d3b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d3c0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20  _TRANSIENT_DB.  
1d3d0 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  );..  memset(pFi
1d3e0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
1d3f0 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
1d400 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61   !zName ){.    a
1d410 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
1d420 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  & !isOpenDirecto
1d430 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ry);.    rc = ge
1d440 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
1d450 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61  THNAME+1, zTmpna
1d460 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
1d470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d490 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
1d4a0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
1d4b0 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
1d4c0 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
1d4d0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
1d4e0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
1d4f0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
1d500 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
1d510 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
1d520 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
1d530 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
1d540 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
1d550 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
1d560 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
1d570 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
1d580 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66 64  O_BINARY);..  fd
1d590 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f   = open(zName, o
1d5a0 70 65 6e 46 6c 61 67 73 2c 20 69 73 44 65 6c 65  penFlags, isDele
1d5b0 74 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44  te?0600:SQLITE_D
1d5c0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1d5d0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 4f 53 54 52  ISSIONS);.  OSTR
1d5e0 41 43 45 34 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE4("OPENX   %-
1d5f0 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
1d600 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
1d610 67 73 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  gs);.  if( fd<0 
1d620 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
1d630 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
1d640 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
1d650 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  ){.    /* Failed
1d660 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
1d670 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
1d680 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
1d690 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 66  d-only. */.    f
1d6a0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
1d6b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1d6c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1d6d0 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c  TE);.    flags |
1d6e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1d6f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74 75  ADONLY;.    retu
1d700 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66 73  rn unixOpen(pVfs
1d710 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  , zPath, pFile, 
1d720 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
1d730 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  );.  }.  if( fd<
1d740 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1d750 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1d760 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c  .  }.  if( isDel
1d770 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
1d780 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
1d790 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
1d7a0 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29     unlink(zName)
1d7b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
1d7c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d7d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
1d7e0 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  lse{.    ((unixF
1d7f0 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6f 70 65  ile*)pFile)->ope
1d800 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
1d810 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  gs;.  }.#endif. 
1d820 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
1d830 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
1d840 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 23   = flags;.  }..#
1d850 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1d860 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
1d870 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1d880 29 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  )!=0 ){.    ((un
1d890 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
1d8a0 69 73 4c 6f 63 6b 61 62 6c 65 20 3d 20 31 3b 0a  isLockable = 1;.
1d8b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1d8c0 73 65 72 74 28 66 64 21 3d 30 29 3b 0a 20 20 69  sert(fd!=0);.  i
1d8d0 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  f( isOpenDirecto
1d8e0 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  ry ){.    rc = o
1d8f0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
1d900 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1d910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  OK ){.      clos
1d930 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
1d940 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  ly leak if fail,
1d950 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
1d960 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1d970 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1d980 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
1d990 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  EC.  fcntl(fd, F
1d9a0 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
1d9b0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
1d9c0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
1d9d0 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
1d9e0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1d9f0 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 23 69 66  EN_MAIN_DB;..#if
1da00 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
1da10 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
1da20 66 28 20 7a 50 61 74 68 21 3d 4e 55 4c 4c 20 26  f( zPath!=NULL &
1da30 26 20 21 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20  & !noLock ){.   
1da40 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
1da50 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
1da60 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
1da70 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
1da80 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
1da90 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
1daa0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
1dab0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
1dac0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
1dad0 2c 20 0a 20 20 20 20 2a 2a 20 30 20 6d 65 61 6e  , .    ** 0 mean
1dae0 73 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  s never use prox
1daf0 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
1db00 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
1db10 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
1db20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1db30 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
1db40 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
1db50 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
1db60 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
1db70 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
1db80 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 20  tfs fsInfo;..   
1db90 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
1dba0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
1dbb0 20 2d 31 20 29 7b 0a 09 09 09 09 28 28 75 6e 69   -1 ){.....((uni
1dbc0 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c  xFile*)pFile)->l
1dbd0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1dbe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69  ;.        if( di
1dbf0 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64  rfd>=0 ) close(d
1dc00 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  irfd); /* silent
1dc10 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  ly leak if fail,
1dc20 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   in error */.   
1dc30 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20       close(fd); 
1dc40 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
1dc50 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
1dc60 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  or */.        re
1dc70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1dc80 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
1dc90 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
1dca0 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
1dcb0 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
1dcc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
1dcd0 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
1dce0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
1dcf0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69  ile(pVfs, fd, di
1dd00 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  rfd, pFile, zPat
1dd10 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c  h, noLock, isDel
1dd20 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ete);.      if( 
1dd30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
1dd50 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
1dd60 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
1dd70 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
1dd80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dd90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1dda0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
1ddb0 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e   return fillInUn
1ddc0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
1ddd0 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
1dde0 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73  Path, noLock, is
1ddf0 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Delete);.}../*.*
1de00 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
1de10 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
1de20 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
1de30 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
1de40 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
1de50 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
1de60 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
1de70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1de80 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
1de90 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1dea0 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
1deb0 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
1dec0 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
1ded0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1dee0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
1def0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
1df00 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
1df10 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df30 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
1df40 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
1df50 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
1df60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1df70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
1df80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1df90 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
1dfa0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
1dfb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
1dfc0 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b  ELETE);.  unlink
1dfd0 28 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66  (zPath);.#ifndef
1dfe0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
1dff0 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69  DIRSYNC.  if( di
1e000 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74  rSync ){.    int
1e010 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70   fd;.    rc = op
1e020 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
1e030 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
1e040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e050 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
1e060 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
1e070 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65  (fd)==-1 ).#else
1e080 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
1e090 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20  (fd) ).#endif.  
1e0a0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63      {.        rc
1e0b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1e0c0 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20  DIR_FSYNC;.     
1e0d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f   }.      if( clo
1e0e0 73 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20  se(fd)&&!rc ){. 
1e0f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e100 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
1e110 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
1e120 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
1e130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e140 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
1e150 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tance of or acce
1e160 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
1e170 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
1e180 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
1e190 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
1e1a0 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
1e1b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
1e1c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1e1d0 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
1e1e0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
1e1f0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
1e200 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
1e210 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
1e220 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
1e230 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
1e240 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
1e250 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
1e260 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
1e270 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
1e280 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
1e290 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
1e2a0 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
1e2b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
1e2c0 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
1e2d0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
1e2e0 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
1e2f0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
1e300 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
1e310 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
1e320 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
1e330 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1e350 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
1e360 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
1e370 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
1e380 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
1e390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e3a0 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
1e3b0 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
1e3c0 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
1e3d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e3e0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
1e3f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1e400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e410 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
1e420 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
1e430 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e440 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
1e450 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
1e460 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
1e470 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e480 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
1e490 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
1e4a0 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
1e4b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1e4c0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1e4d0 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
1e4e0 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
1e4f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
1e500 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
1e510 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
1e520 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
1e530 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
1e540 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  access(zPath, am
1e550 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75  ode)==0);.  retu
1e560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e570 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
1e580 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
1e590 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
1e5a0 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
1e5b0 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
1e5c0 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
1e5d0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1e5e0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
1e5f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
1e600 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
1e610 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
1e620 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
1e630 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
1e640 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
1e650 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
1e660 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
1e670 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
1e680 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
1e690 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
1e6a0 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
1e6b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1e6c0 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
1e6d0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
1e6e0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
1e6f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e700 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
1e710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1e720 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
1e730 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
1e740 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
1e750 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
1e780 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
1e790 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
1e7a0 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
1e7b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
1e7c0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
1e7d0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
1e7e0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
1e7f0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
1e800 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
1e810 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
1e820 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
1e830 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
1e840 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
1e850 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
1e860 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
1e870 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
1e880 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
1e890 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
1e8a0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
1e8b0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
1e8c0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
1e8d0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
1e8e0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1e8f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
1e900 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
1e910 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
1e920 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
1e930 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e940 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74  R(pVfs);..  zOut
1e950 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
1e960 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
1e970 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
1e980 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
1e990 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
1e9a0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1e9b0 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
1e9c0 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75    if( getcwd(zOu
1e9d0 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
1e9e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e9f0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
1ea00 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
1ea10 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
1ea20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1ea30 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
1ea40 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
1ea50 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
1ea60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ea70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
1ea80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1ea90 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
1eaa0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
1eab0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
1eac0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
1ead0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
1eae0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
1eaf0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1eb00 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
1eb10 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
1eb20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
1eb30 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
1eb40 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
1eb50 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
1eb60 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
1eb70 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
1eb80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1eb90 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1eba0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
1ebb0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
1ebc0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
1ebd0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
1ebe0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
1ebf0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
1ec00 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
1ec10 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
1ec20 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
1ec30 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
1ec40 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
1ec50 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
1ec60 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
1ec70 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
1ec80 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
1ec90 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
1eca0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
1ecb0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
1ecc0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
1ecd0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
1ece0 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
1ecf0 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
1ed00 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1ed10 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
1ed20 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1ed30 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
1ed40 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
1ed50 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
1ed60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ed70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
1ed80 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1ed90 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
1eda0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
1edb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1edc0 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
1edd0 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
1ede0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
1edf0 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
1ee00 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
1ee10 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
1ee20 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
1ee30 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
1ee40 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
1ee50 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
1ee60 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
1ee70 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
1ee80 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
1ee90 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
1eea0 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
1eeb0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
1eec0 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
1eed0 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
1eee0 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
1eef0 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
1ef00 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
1ef10 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
1ef20 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
1ef30 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
1ef40 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
1ef50 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
1ef60 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
1ef70 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
1ef80 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
1ef90 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
1efa0 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
1efb0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
1efc0 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
1efd0 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
1efe0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
1eff0 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
1f000 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
1f010 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
1f020 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
1f030 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
1f040 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
1f050 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
1f060 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
1f070 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
1f080 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
1f090 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
1f0a0 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
1f0b0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
1f0c0 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
1f0d0 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
1f0e0 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
1f0f0 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
1f100 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
1f110 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
1f120 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
1f130 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
1f140 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
1f150 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
1f160 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
1f170 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
1f180 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
1f190 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
1f1a0 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
1f1b0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
1f1c0 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
1f1d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1f1e0 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
1f1f0 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
1f200 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
1f210 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
1f220 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
1f230 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
1f240 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
1f250 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1f260 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
1f270 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f280 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1f290 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
1f2a0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
1f2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1f2c0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
1f2d0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
1f2e0 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
1f2f0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
1f300 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
1f310 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
1f320 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
1f330 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
1f340 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
1f350 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
1f360 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
1f370 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
1f380 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
1f390 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
1f3a0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
1f3b0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
1f3c0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1f3d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f3e0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
1f3f0 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
1f400 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
1f410 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
1f420 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
1f430 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
1f440 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
1f450 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
1f460 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
1f470 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
1f480 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
1f490 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
1f4a0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
1f4b0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
1f4c0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
1f4d0 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
1f4e0 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
1f4f0 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
1f500 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
1f510 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
1f520 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
1f530 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
1f540 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
1f550 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
1f560 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
1f570 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
1f580 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
1f590 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
1f5a0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
1f5b0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
1f5c0 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
1f5d0 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
1f5e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1f5f0 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
1f600 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
1f610 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
1f620 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
1f630 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
1f640 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
1f650 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
1f660 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
1f670 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
1f680 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
1f690 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
1f6a0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
1f6b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f6c0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
1f6d0 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
1f6e0 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
1f6f0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
1f700 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
1f710 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
1f720 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
1f730 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
1f740 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
1f750 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
1f760 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
1f770 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
1f780 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
1f790 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
1f7a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f7b0 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
1f7c0 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
1f7d0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
1f7e0 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
1f7f0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
1f800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42   }else{.      nB
1f810 75 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42  uf = read(fd, zB
1f820 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20  uf, nBuf);.     
1f830 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
1f840 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
1f850 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
1f860 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1f870 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1f880 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1f890 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1f8a0 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
1f8b0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
1f8c0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
1f8d0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
1f8e0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
1f8f0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
1f900 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
1f910 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
1f920 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
1f930 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
1f940 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
1f950 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
1f960 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
1f970 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1f980 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1f990 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
1f9a0 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
1f9b0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
1f9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1f9d0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
1f9e0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
1f9f0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
1fa00 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1fa10 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
1fa20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
1fa30 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
1fa40 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
1fa50 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
1fa60 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
1fa70 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
1fa80 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
1fa90 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1faa0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1fab0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
1fac0 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
1fad0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
1fae0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
1faf0 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
1fb00 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
1fb10 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1fb20 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
1fb30 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
1fb40 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
1fb50 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
1fb60 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
1fb70 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
1fb80 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
1fb90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1fba0 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
1fbb0 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
1fbc0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
1fbd0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1fbe0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
1fbf0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
1fc00 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1fc10 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
1fc20 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
1fc30 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
1fc40 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
1fc50 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
1fc60 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
1fc70 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
1fc80 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1fc90 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
1fca0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
1fcb0 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
1fcc0 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
1fcd0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
1fce0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
1fcf0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
1fd00 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
1fd10 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
1fd20 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
1fd30 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
1fd40 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
1fd50 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
1fd60 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
1fd70 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
1fd80 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1fd90 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
1fda0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
1fdb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1fdc0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
1fdd0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
1fde0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
1fdf0 77 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  w){.#if defined(
1fe00 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
1fe10 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
1fe20 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f  );.  *prNow = t/
1fe30 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
1fe40 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  7.5;.#elif OS_VX
1fe50 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
1fe60 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
1fe70 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
1fe80 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
1fe90 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  Now);.  *prNow =
1fea0 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
1feb0 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
1fec0 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
1fed0 38 36 34 30 30 30 30 30 30 30 30 30 30 30 2e 30  86400000000000.0
1fee0 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
1fef0 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
1ff00 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
1ff10 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f  Now, 0);.  *prNo
1ff20 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
1ff30 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
1ff40 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
1ff50 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
1ff60 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1ff70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1ff80 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
1ff90 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
1ffa0 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  prNow = sqlite3_
1ffb0 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34  current_time/864
1ffc0 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
1ffd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
1ffe0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1fff0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
20000 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn 0;.}../*.** W
20010 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74  e added the xGet
20020 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
20030 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65  od with the inte
20040 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69  ntion of providi
20050 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77  ng.** better low
20060 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73  -level error mes
20070 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61  sages when opera
20080 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
20090 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
200a0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
200b0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f  eration.  But so
200c0 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68   far, none of th
200d0 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c  at has been impl
200e0 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68  emented.** in th
200f0 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73  e core.  So this
20100 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
20110 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e  r called.  For n
20120 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  ow, it is merely
20130 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  .** a place-hold
20140 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
20150 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
20160 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
20170 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
20180 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
20190 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
201a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
201b0 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
201c0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
201d0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
201e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
201f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20200 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
20210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
20220 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
20230 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
20240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20250 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
20260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202a0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
202b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
20300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
20310 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
20320 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
20330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20340 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
20350 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
20360 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
20370 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
20380 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
20390 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
203a0 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
203b0 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
203c0 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
203d0 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
203e0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
203f0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
20400 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
20410 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
20420 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
20430 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
20440 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
20450 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
20460 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
20470 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
20480 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
20490 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
204a0 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
204b0 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
204c0 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
204d0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
204e0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
204f0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
20500 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
20510 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
20520 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
20530 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
20540 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
20550 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
20560 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
20570 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
20580 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
20590 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
205a0 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
205b0 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
205c0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
205d0 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
205e0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
205f0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
20600 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
20610 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
20620 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
20630 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
20640 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
20650 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
20660 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
20670 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
20680 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
20690 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
206a0 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
206b0 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
206c0 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
206d0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
206e0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
206f0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
20700 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
20710 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
20720 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
20730 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
20740 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
20750 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
20760 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
20770 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
20780 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
20790 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
207a0 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
207b0 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
207c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
207d0 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
207e0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
207f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
20800 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
20810 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
20820 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09      0x40000000..
20830 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53     ..**      RES
20840 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
20850 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
20860 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
20870 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
20880 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
20890 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
208a0 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
208b0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
208c0 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
208d0 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
208e0 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
208f0 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
20900 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
20910 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
20920 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
20930 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
20940 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
20950 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
20960 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
20970 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
20980 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
20990 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
209a0 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
209b0 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
209c0 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
209d0 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
209e0 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
209f0 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
20a00 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
20a10 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
20a20 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
20a30 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
20a40 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
20a50 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
20a60 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
20a70 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
20a80 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
20a90 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
20aa0 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
20ab0 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
20ac0 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
20ad0 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
20ae0 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
20af0 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
20b00 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
20b10 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
20b20 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
20b30 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
20b40 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
20b50 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
20b60 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
20b70 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
20b80 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
20b90 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
20ba0 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
20bb0 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
20bc0 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
20bd0 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
20be0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20bf0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
20c00 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
20c10 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
20c20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
20c30 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
20c40 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
20c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
20c60 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
20c70 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
20c80 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
20c90 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
20ca0 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
20cd0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
20ce0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
20cf0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
20d00 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
20d10 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
20d20 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
20d30 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
20d40 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
20d50 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
20d60 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
20d70 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
20d80 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
20d90 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
20da0 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
20db0 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
20dc0 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
20dd0 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
20de0 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
20df0 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
20e00 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
20e10 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
20e20 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
20e30 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
20e40 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
20e50 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
20e60 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
20e70 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
20e80 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
20e90 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
20ea0 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
20eb0 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
20ec0 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
20ed0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
20ee0 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
20ef0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
20f00 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
20f10 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
20f20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
20f30 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
20f40 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
20f50 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
20f60 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
20f70 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
20f80 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
20f90 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
20fa0 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
20fb0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
20fc0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20fd0 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
20fe0 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
20ff0 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
21000 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
21010 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
21020 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
21030 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
21040 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
21050 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
21060 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
21070 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
21080 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
21090 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
210a0 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
210b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
210c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
210d0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
210e0 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
210f0 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
21100 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
21110 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
21120 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
21130 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
21140 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
21150 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
21160 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
21170 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
21180 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
21190 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
211a0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
211b0 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
211c0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
211d0 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
211e0 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
211f0 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
21200 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
21210 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
21220 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
21230 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
21240 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
21250 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
21260 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
21270 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
21280 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
21290 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
212a0 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
212b0 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
212c0 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
212d0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
212e0 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
212f0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
21300 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
21310 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
21320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21330 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
21340 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
21350 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
21360 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
21370 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
21380 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
21390 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
213a0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
213b0 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
213c0 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
213d0 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
213e0 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
213f0 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
21400 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
21410 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
21420 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
21430 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
21440 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
21450 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
21460 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
21470 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
21480 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
21490 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
214a0 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
214b0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
214c0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
214d0 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
214e0 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
214f0 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
21500 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
21510 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
21520 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
21530 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
21540 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
21550 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
21560 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
21570 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
21580 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21590 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
215a0 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
215b0 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
215c0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
215d0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
215e0 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
215f0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
21600 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
21610 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
21620 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
21630 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
21640 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
21650 61 20 74 68 69 72 64 20 66 69 6c 65 20 2d 20 74  a third file - t
21660 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  he host ID file 
21670 2d 20 75 73 65 64 20 61 73 20 61 20 70 65 72 73  - used as a pers
21680 69 73 74 65 6e 74 20 72 65 63 6f 72 64 0a 2a 2a  istent record.**
21690 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 64 65   of a unique ide
216a0 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
216b0 68 6f 73 74 2c 20 61 20 31 32 38 2d 62 79 74 65  host, a 128-byte
216c0 20 75 6e 69 71 75 65 20 68 6f 73 74 20 69 64 20   unique host id 
216d0 66 69 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 70  file.** in the p
216e0 61 74 68 20 64 65 66 69 6e 65 64 20 62 79 20 74  ath defined by t
216f0 68 65 20 48 4f 53 54 49 44 50 41 54 48 20 6d 61  he HOSTIDPATH ma
21700 63 72 6f 20 28 64 65 66 61 75 6c 74 20 76 61 6c  cro (default val
21710 75 65 20 69 73 0a 2a 2a 20 2f 4c 69 62 72 61 72  ue is.** /Librar
21720 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70  y/Caches/.com.ap
21730 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48  ple.sqliteConchH
21740 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  ostId)..**.** Re
21750 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
21760 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
21770 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
21780 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
21790 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
217a0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
217b0 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
217c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
217d0 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
217e0 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
217f0 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
21800 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
21810 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
21820 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
21830 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
21840 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
21850 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
21860 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
21870 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
21880 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
21890 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
218a0 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
218b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
218c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
218d0 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
218e0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
218f0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
21900 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
21910 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
21920 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
21930 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
21940 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
21950 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
21960 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
21970 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
21980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
21990 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
219a0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
219b0 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
219c0 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
219d0 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
219e0 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
219f0 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
21a00 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
21a10 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
21a20 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
21a30 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
21a40 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
21a50 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
21a60 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
21a70 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
21a80 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
21a90 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
21aa0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
21ab0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
21ac0 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
21ad0 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
21ae0 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
21af0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
21b00 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
21b10 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 48 4f 53  ation.**.**  HOS
21b20 54 49 44 50 41 54 48 0a 2a 2a 0a 2a 2a 20 20 20  TIDPATH.**.**   
21b30 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
21b40 65 20 64 65 66 61 75 6c 74 20 68 6f 73 74 20 49  e default host I
21b50 44 20 66 69 6c 65 20 70 61 74 68 20 6c 6f 63 61  D file path loca
21b60 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
21b70 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
21b80 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
21b90 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
21ba0 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
21bb0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
21bc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
21bd0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
21be0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
21bf0 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
21c00 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
21c10 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
21c20 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
21c30 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
21c40 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
21c50 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
21c60 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
21c70 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
21c80 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
21c90 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
21ca0 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
21cb0 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
21cc0 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
21cd0 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
21ce0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
21cf0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
21d00 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
21d10 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
21d20 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
21d30 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
21d40 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
21d50 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
21d60 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
21d70 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
21d80 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
21d90 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
21da0 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
21db0 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
21dc0 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
21dd0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
21de0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
21df0 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
21e00 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
21e10 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
21e20 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
21e30 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
21e40 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
21e50 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
21e60 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
21e70 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
21e80 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
21e90 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
21ea0 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
21eb0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
21ec0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21ed0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 23 69  OCKING_STYLE..#i
21ee0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21ef0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
21f00 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
21f10 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
21f20 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
21f30 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
21f40 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
21f50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
21f60 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
21f70 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
21f80 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
21f90 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
21fa0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
21fb0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
21fc0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
21fd0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
21fe0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
21ff0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
22000 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
22010 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
22020 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
22030 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
22040 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
22050 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
22060 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
22070 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22080 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
22090 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
220a0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
220b0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
220c0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
220d0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
220e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
220f0 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
22100 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
22110 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
22120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
22130 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
22140 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
22150 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
22160 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
22170 68 65 20 63 6f 6e 63 68 20 69 73 20 63 75 72 72  he conch is curr
22180 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a 20 20  ently held */.  
22190 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
221a0 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
221b0 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
221c0 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
221d0 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
221e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
221f0 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
22200 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
22210 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
22220 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
22230 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c 45 4e  };../* HOSTIDLEN
22240 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20 62 6f   and CONCHLEN bo
22250 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61 63 65  th include space
22260 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20   for the string 
22270 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  .** terminating 
22280 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  nul .*/.#define 
22290 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20 20 20  HOSTIDLEN       
222a0 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20 43 4f    128.#define CO
222b0 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20 20 20  NCHLEN          
222c0 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f 53 54  (MAXPATHLEN+HOST
222d0 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64 65 66  IDLEN+1).#ifndef
222e0 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20 64 65   HOSTIDPATH.# de
222f0 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54 48 20  fine HOSTIDPATH 
22300 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72 79 2f        "/Library/
22310 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c  Caches/.com.appl
22320 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48 6f 73  e.sqliteConchHos
22330 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  tId".#endif../* 
22340 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f 70 79  basically a copy
22350 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65   of unixRandomne
22360 73 73 20 77 69 74 68 20 64 69 66 66 65 72 65 6e  ss with differen
22370 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61 76 69  t.** test behavi
22380 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f 0a 73  or built in */.s
22390 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
223a0 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28 63 68  enerateHostID(ch
223b0 61 72 20 2a 70 48 6f 73 74 49 44 29 7b 0a 20 20  ar *pHostID){.  
223c0 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 6c 65 6e  int pid, fd, len
223d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
223e0 72 20 2a 6b 65 79 20 3d 20 28 75 6e 73 69 67 6e  r *key = (unsign
223f0 65 64 20 63 68 61 72 20 2a 29 70 48 6f 73 74 49  ed char *)pHostI
22400 44 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 6b  D;.  .  memset(k
22410 65 79 2c 20 30 2c 20 48 4f 53 54 49 44 4c 45 4e  ey, 0, HOSTIDLEN
22420 29 3b 0a 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  );.  len = 0;.  
22430 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f  fd = open("/dev/
22440 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
22450 4c 59 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30  LY);.  if( fd>=0
22460 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 72 65   ){.    len = re
22470 61 64 28 66 64 2c 20 6b 65 79 2c 20 48 4f 53 54  ad(fd, key, HOST
22480 49 44 4c 45 4e 29 3b 0a 20 20 20 20 63 6c 6f 73  IDLEN);.    clos
22490 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
224a0 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69  ly leak the fd i
224b0 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20  f it fails */.  
224c0 7d 0a 20 20 69 66 28 20 6c 65 6e 20 3c 20 48 4f  }.  if( len < HO
224d0 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 74  STIDLEN ){.    t
224e0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 74 69 6d  ime_t t;.    tim
224f0 65 28 26 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&t);.    memcp
22500 79 28 6b 65 79 2c 20 26 74 2c 20 73 69 7a 65 6f  y(key, &t, sizeo
22510 66 28 74 29 29 3b 0a 20 20 20 20 70 69 64 20 3d  f(t));.    pid =
22520 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 6d   getpid();.    m
22530 65 6d 63 70 79 28 26 6b 65 79 5b 73 69 7a 65 6f  emcpy(&key[sizeo
22540 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
22550 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d 0a 20  eof(pid));.  }. 
22560 20 0a 23 69 66 64 65 66 20 4d 41 4b 45 5f 50 52   .#ifdef MAKE_PR
22570 45 54 54 59 5f 48 4f 53 54 49 44 0a 20 20 7b 0a  ETTY_HOSTID.  {.
22580 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2f      int i;.    /
22590 2a 20 66 69 6c 74 65 72 20 74 68 65 20 62 79 74  * filter the byt
225a0 65 73 20 69 6e 74 6f 20 70 72 69 6e 74 61 62 6c  es into printabl
225b0 65 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65  e ascii characte
225c0 72 73 20 61 6e 64 20 4e 55 4c 20 74 65 72 6d 69  rs and NUL termi
225d0 6e 61 74 65 20 2a 2f 0a 20 20 20 20 6b 65 79 5b  nate */.    key[
225e0 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 5d 20 3d  (HOSTIDLEN-1)] =
225f0 20 30 78 30 30 3b 0a 20 20 20 20 66 6f 72 28 20   0x00;.    for( 
22600 69 3d 30 3b 20 69 3c 28 48 4f 53 54 49 44 4c 45  i=0; i<(HOSTIDLE
22610 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  N-1); i++ ){.   
22620 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
22630 20 70 61 20 3d 20 6b 65 79 5b 69 5d 26 30 78 37   pa = key[i]&0x7
22640 46 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 3c  F;.      if( pa<
22650 30 78 32 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x20 ){.        
22660 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b 69 5d  key[i] = (key[i]
22670 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29 20 3f  &0x80 == 0x80) ?
22680 20 70 61 2b 30 78 34 30 20 3a 20 70 61 2b 30 78   pa+0x40 : pa+0x
22690 32 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  20;.      }else 
226a0 69 66 28 20 70 61 3d 3d 30 78 37 46 20 29 7b 0a  if( pa==0x7F ){.
226b0 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d 20 3d          key[i] =
226c0 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d 3d   (key[i]&0x80 ==
226d0 20 30 78 38 30 29 20 3f 20 70 61 3d 30 78 32 30   0x80) ? pa=0x20
226e0 20 3a 20 70 61 2b 30 78 37 45 3b 0a 20 20 20 20   : pa+0x7E;.    
226f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
22700 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
22710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 77  LITE_OK;.}../* w
22720 72 69 74 65 73 20 74 68 65 20 68 6f 73 74 20 69  rites the host i
22730 64 20 70 61 74 68 20 74 6f 20 70 61 74 68 2c 20  d path to path, 
22740 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 20 61  path should be a
22750 6e 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  n pre-allocated 
22760 62 75 66 66 65 72 0a 2a 2a 20 77 69 74 68 20 65  buffer.** with e
22770 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f 72 20  nough space for 
22780 61 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  a path .*/.stati
22790 63 20 76 6f 69 64 20 70 72 6f 78 79 47 65 74 48  c void proxyGetH
227a0 6f 73 74 49 44 50 61 74 68 28 63 68 61 72 20 2a  ostIDPath(char *
227b0 70 61 74 68 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  path, size_t len
227c0 29 7b 0a 20 20 73 74 72 6c 63 70 79 28 70 61 74  ){.  strlcpy(pat
227d0 68 2c 20 48 4f 53 54 49 44 50 41 54 48 2c 20 6c  h, HOSTIDPATH, l
227e0 65 6e 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  en);.#ifdef SQLI
227f0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
22800 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
22810 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 73  >0 ){.    char s
22820 75 66 66 69 78 5b 32 5d 20 3d 20 22 31 22 3b 0a  uffix[2] = "1";.
22830 20 20 20 20 73 75 66 66 69 78 5b 30 5d 20 3d 20      suffix[0] = 
22840 73 75 66 66 69 78 5b 30 5d 20 2b 20 73 71 6c 69  suffix[0] + sqli
22850 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a  te3_hostid_num;.
22860 20 20 20 20 73 74 72 6c 63 61 74 28 70 61 74 68      strlcat(path
22870 2c 20 73 75 66 66 69 78 2c 20 6c 65 6e 29 3b 0a  , suffix, len);.
22880 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
22890 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44  RACE3("GETHOSTID
228a0 50 41 54 48 20 20 25 73 20 70 69 64 3d 25 64 5c  PATH  %s pid=%d\
228b0 6e 22 2c 20 70 61 74 68 2c 20 67 65 74 70 69 64  n", path, getpid
228c0 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67 65 74 20 74  ());.}../* get t
228d0 68 65 20 68 6f 73 74 20 49 44 20 66 72 6f 6d 20  he host ID from 
228e0 61 20 73 71 6c 69 74 65 20 68 6f 73 74 69 64 20  a sqlite hostid 
228f0 66 69 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 74  file stored in t
22900 68 65 20 0a 2a 2a 20 75 73 65 72 2d 73 70 65 63  he .** user-spec
22910 69 66 69 63 20 74 6d 70 20 64 69 72 65 63 74 6f  ific tmp directo
22920 72 79 2c 20 63 72 65 61 74 65 20 74 68 65 20 49  ry, create the I
22930 44 20 69 66 20 69 74 27 73 20 6e 6f 74 20 74 68  D if it's not th
22940 65 72 65 20 61 6c 72 65 61 64 79 20 0a 2a 2f 0a  ere already .*/.
22950 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
22960 47 65 74 48 6f 73 74 49 44 28 63 68 61 72 20 2a  GetHostID(char *
22970 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
22980 72 72 6f 72 29 7b 0a 20 20 69 6e 74 20 66 64 3b  rror){.  int fd;
22990 0a 20 20 63 68 61 72 20 70 61 74 68 5b 4d 41 58  .  char path[MAX
229a0 50 41 54 48 4c 45 4e 5d 3b 20 0a 20 20 73 69 7a  PATHLEN]; .  siz
229b0 65 5f 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 72  e_t len;.  int r
229c0 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  c=SQLITE_OK;..  
229d0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 50 61  proxyGetHostIDPa
229e0 74 68 28 70 61 74 68 2c 20 4d 41 58 50 41 54 48  th(path, MAXPATH
229f0 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  LEN);.  /* try t
22a00 6f 20 63 72 65 61 74 65 20 74 68 65 20 68 6f 73  o create the hos
22a10 74 20 49 44 20 66 69 6c 65 2c 20 69 66 20 69 74  t ID file, if it
22a20 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
22a30 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
22a40 73 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e  s */.  fd = open
22a50 28 70 61 74 68 2c 20 4f 5f 43 52 45 41 54 7c 4f  (path, O_CREAT|O
22a60 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 2c 20  _WRONLY|O_EXCL, 
22a70 30 36 34 34 29 3b 0a 20 20 69 66 28 20 66 64 3c  0644);.  if( fd<
22a80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  0 ){.    int err
22a90 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20 20 69  =errno;....    i
22aa0 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
22ab0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
22ac0 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20 73  PROXY_DEBUG /* s
22ad0 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65 72  et the sqlite er
22ae0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73 74  ror message inst
22af0 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66 70 72  ead */.      fpr
22b00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
22b10 6c 69 74 65 20 65 72 72 6f 72 20 63 72 65 61 74  lite error creat
22b20 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65  ing host ID file
22b30 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %s: %s\n",.    
22b40 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20            path, 
22b50 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a  strerror(err));.
22b60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
22b70 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
22b80 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 63 6f  .    }.    /* co
22b90 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
22ba0 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69 74 20  e file, read it 
22bb0 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 66  instead */.    f
22bc0 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 4f  d = open(path, O
22bd0 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 29 3b  _RDONLY|O_EXCL);
22be0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
22bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 50  .#ifdef SQLITE_P
22c00 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20 73 65  ROXY_DEBUG /* se
22c10 74 20 74 68 65 20 73 71 6c 69 74 65 20 65 72 72  t the sqlite err
22c20 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73 74 65  or message inste
22c30 61 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ad */.      int 
22c40 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
22c50 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
22c60 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72 6f 72  r, "sqlite error
22c70 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20 49 44   opening host ID
22c80 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c   file %s: %s\n",
22c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22ca0 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28 65 72  ath, strerror(er
22cb0 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  r));.#endif.    
22cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22cd0 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PERM;.    }.    
22ce0 6c 65 6e 20 3d 20 70 72 65 61 64 28 66 64 2c 20  len = pread(fd, 
22cf0 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49 44 4c  pHostID, HOSTIDL
22d00 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  EN, 0);.    if( 
22d10 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2a  len<0 ){.      *
22d20 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a  pError = errno;.
22d30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22d40 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
22d50 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 3c    }else if( len<
22d60 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20  HOSTIDLEN ){.   
22d70 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a     *pError = 0;.
22d80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22d90 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
22da0 41 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c  AD;.    }.    cl
22db0 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
22dc0 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64  ntly leak the fd
22dd0 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a   if it fails */.
22de0 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47 45      OSTRACE3("GE
22df0 54 48 4f 53 54 49 44 20 20 72 65 61 64 20 25 73  THOSTID  read %s
22e00 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f 73   pid=%d\n", pHos
22e10 74 49 44 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  tID, getpid());.
22e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 77   }else{.    /* w
22e40 65 27 72 65 20 63 72 65 61 74 69 6e 67 20 74 68  e're creating th
22e50 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20 28  e host ID file (
22e60 75 73 65 20 61 20 72 61 6e 64 6f 6d 20 73 74 72  use a random str
22e70 69 6e 67 20 6f 66 20 62 79 74 65 73 29 20 2a 2f  ing of bytes) */
22e80 0a 20 20 20 20 70 72 6f 78 79 47 65 6e 65 72 61  .    proxyGenera
22e90 74 65 48 6f 73 74 49 44 28 70 48 6f 73 74 49 44  teHostID(pHostID
22ea0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 77 72  );.    len = pwr
22eb0 69 74 65 28 66 64 2c 20 70 48 6f 73 74 49 44 2c  ite(fd, pHostID,
22ec0 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29 3b 0a   HOSTIDLEN, 0);.
22ed0 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
22ee0 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  .      *pError =
22ef0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
22f00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22f10 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
22f20 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44 4c   if( len<HOSTIDL
22f30 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  EN ){.      *pEr
22f40 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ror = 0;.      r
22f50 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22f60 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 20 20  _WRITE;.    }.  
22f70 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
22f80 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68  silently leak th
22f90 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73  e fd if it fails
22fa0 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33   */.    OSTRACE3
22fb0 28 22 47 45 54 48 4f 53 54 49 44 20 20 77 72 6f  ("GETHOSTID  wro
22fc0 74 65 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  te %s pid=%d\n",
22fd0 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69 64   pHostID, getpid
22fe0 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
22ff0 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  rc;.  }.}..stati
23000 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
23010 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
23020 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
23030 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
23040 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
23050 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
23060 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
23070 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
23080 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
23090 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
230a0 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
230b0 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
230c0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
230d0 49 52 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 66 73  IR.  {.    confs
230e0 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
230f0 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61  ER_TEMP_DIR, lPa
23100 74 68 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 20  th, maxLen);.   
23110 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
23120 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
23130 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  cks", maxLen);. 
23140 20 20 20 69 66 28 20 6d 6b 64 69 72 28 6c 50 61     if( mkdir(lPa
23150 74 68 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  th, SQLITE_DEFAU
23160 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
23170 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
23180 20 20 2f 2a 20 69 66 20 6d 6b 64 69 72 20 66 61    /* if mkdir fa
23190 69 6c 73 2c 20 68 61 6e 64 6c 65 20 61 73 20 6c  ils, handle as l
231a0 6f 63 6b 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ock file creatio
231b0 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  n failure */.   
231c0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
231d0 6e 6f 3b 0a 23 20 20 69 66 64 65 66 20 53 51 4c  no;.#  ifdef SQL
231e0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
231f0 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
23200 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
23210 74 66 28 73 74 64 65 72 72 2c 20 22 70 72 6f 78  tf(stderr, "prox
23220 79 47 65 74 4c 6f 63 6b 50 61 74 68 3a 20 6d 6b  yGetLockPath: mk
23230 64 69 72 28 25 73 2c 30 25 6f 29 20 65 72 72 6f  dir(%s,0%o) erro
23240 72 20 25 64 20 25 73 5c 6e 22 2c 20 6c 50 61 74  r %d %s\n", lPat
23250 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
23260 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
23270 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
23280 53 53 49 4f 4e 53 2c 20 65 72 72 2c 20 73 74 72  SSIONS, err, str
23290 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 20 20 20  error(err));.   
232a0 20 20 20 7d 0a 23 20 20 65 6e 64 69 66 0a 20 20     }.#  endif.  
232b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f    }else{.      O
232c0 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f 43 4b  STRACE3("GETLOCK
232d0 50 41 54 48 20 20 6d 6b 64 69 72 20 25 73 20 70  PATH  mkdir %s p
232e0 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
232f0 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20   getpid());.    
23300 7d 0a 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  }.    .  }.# els
23310 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
23320 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
23330 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
23340 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
23350 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
23360 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
23370 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
23380 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
23390 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
233a0 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
233b0 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
233c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
233d0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
233e0 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
233f0 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
23400 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b  i+len+7)<maxLen;
23410 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
23420 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
23430 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
23440 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
23450 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
23460 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
23470 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
23480 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
23490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
234a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
234b0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
234c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
234d0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
234e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
234f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
23500 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
23510 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
23520 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
23530 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
23540 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
23550 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
23560 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
23570 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
23580 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
23590 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
235a0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
235b0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
235c0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
235d0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
235e0 65 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73 74 20  eUnixFile(const 
235f0 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e 69 78  char *path, unix
23600 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29 20 7b  File **ppFile) {
23610 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74  .  int fd;.  int
23620 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75   dirfd = -1;.  u
23630 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
23640 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23650 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  _OK;.  sqlite3_v
23660 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 0a 20 20  fs dummyVfs;..  
23670 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
23680 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
23690 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
236a0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
236b0 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  S);.  if( fd<0 )
236c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
236d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
236e0 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
236f0 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
23700 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
23710 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 69 66  unixFile));.  if
23720 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
23730 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23740 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
23750 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
23760 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
23770 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
23780 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 64 75  nixFile));..  du
23790 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
237a0 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
237b0 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 72 63  ckIoFinder;.  rc
237c0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
237d0 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
237e0 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33   dirfd, (sqlite3
237f0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
23800 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  h, 0, 0);.  if( 
23810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23820 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
23830 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
23840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
23850 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
23860 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29      .  close(fd)
23870 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
23880 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20  ak fd if error, 
23890 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e  we're already in
238a0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69   error */.  sqli
238b0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
238c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
238d0 2f 2a 20 74 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* takes the con
238e0 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
238f0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
23900 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
23910 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
23920 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
23930 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
23940 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
23950 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
23960 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
23970 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
23980 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
23990 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
239a0 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
239b0 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
239c0 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
239d0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
239e0 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
239f0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
23a00 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
23a10 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
23a20 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
23a30 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
23a40 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
23a50 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
23a60 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
23a70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
23a80 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
23a90 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
23aa0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
23ab0 64 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d>0 ){.    retur
23ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
23ad0 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
23ae0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
23af0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
23b00 0a 20 20 20 20 63 68 61 72 20 74 65 73 74 56 61  .    char testVa
23b10 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  lue[CONCHLEN];. 
23b20 20 20 20 63 68 61 72 20 63 6f 6e 63 68 56 61 6c     char conchVal
23b30 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  ue[CONCHLEN];.  
23b40 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
23b50 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
23b60 20 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61 74 68   char *tLockPath
23b70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
23b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23b90 0a 20 20 20 20 69 6e 74 20 72 65 61 64 52 63 20  .    int readRc 
23ba0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23bb0 20 69 6e 74 20 73 79 6e 63 50 65 72 6d 73 20 3d   int syncPerms =
23bc0 20 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41 43 45   0;..    OSTRACE
23bd0 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  4("TAKECONCH  %d
23be0 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
23bf0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
23c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
23c10 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
23c20 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
23c30 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
23c40 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
23c50 0a 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  ..    rc = conch
23c60 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
23c70 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
23c80 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
23c90 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
23ca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23cb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
23cc0 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
23cd0 20 20 6d 65 6d 73 65 74 28 74 65 73 74 56 61 6c    memset(testVal
23ce0 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45 4e 29  ue, 0, CONCHLEN)
23cf0 3b 20 2f 2a 20 63 6f 6e 63 68 20 69 73 20 66 69  ; /* conch is fi
23d00 78 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  xed size */.    
23d10 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48    rc = proxyGetH
23d20 6f 73 74 49 44 28 74 65 73 74 56 61 6c 75 65 2c  ostID(testValue,
23d30 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20   &pError);.     
23d40 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
23d50 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
23d60 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
23d70 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
23d80 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
23d90 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
23da0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
23db0 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65 73      strlcpy(&tes
23dc0 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e  tValue[HOSTIDLEN
23dd0 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
23de0 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
23df0 45 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EN);.      }.   
23e00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
23e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23e20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
23e30 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
23e40 0a 20 20 20 20 72 65 61 64 52 63 20 3d 20 75 6e  .    readRc = un
23e50 69 78 52 65 61 64 28 28 73 71 6c 69 74 65 33 5f  ixRead((sqlite3_
23e60 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65  file *)conchFile
23e70 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f  , conchValue, CO
23e80 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
23e90 69 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c 49  if( readRc!=SQLI
23ea0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23eb0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  EAD ){.      if(
23ec0 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45 5f   readRc!=SQLITE_
23ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
23ee0 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
23ef0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
23f00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
23f10 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
23f20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
23f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23f40 20 20 72 63 20 3d 20 72 65 61 64 52 63 3b 0a 20    rc = readRc;. 
23f50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
23f60 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
23f70 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74   }.      /* if t
23f80 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
23f90 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
23fa0 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
23fb0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
23fc0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
23fd0 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
23fe0 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
23ff0 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
24000 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
24010 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
24020 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
24030 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
24040 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
24050 69 6e 20 74 68 65 72 65 20 2a 2f 0a 20 20 20 20  in there */.    
24060 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d 70 28      if( !memcmp(
24070 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63 68  testValue, conch
24080 56 61 6c 75 65 2c 20 48 4f 53 54 49 44 4c 45 4e  Value, HOSTIDLEN
24090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
240a0 4c 6f 63 6b 50 61 74 68 20 3d 20 28 63 68 61 72  LockPath = (char
240b0 20 2a 29 26 63 6f 6e 63 68 56 61 6c 75 65 5b 48   *)&conchValue[H
240c0 4f 53 54 49 44 4c 45 4e 5d 3b 0a 20 20 20 20 20  OSTIDLEN];.     
240d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
240e0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20  keconch;.       
240f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
24100 20 20 20 20 20 20 20 20 2f 2a 20 77 65 27 76 65          /* we've
24110 20 67 6f 74 20 74 68 65 20 63 6f 6e 63 68 20 69   got the conch i
24120 66 20 63 6f 6e 63 68 56 61 6c 75 65 20 6d 61 74  f conchValue mat
24130 63 68 65 73 20 6f 75 72 20 70 61 74 68 20 61 6e  ches our path an
24140 64 20 68 6f 73 74 20 49 44 20 2a 2f 0a 20 20 20  d host ID */.   
24150 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d 70       if( !memcmp
24160 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63  (testValue, conc
24170 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e  hValue, CONCHLEN
24180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
24190 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
241a0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
241b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
241c0 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
241d0 20 72 65 61 64 20 6d 65 61 6e 73 20 77 65 27 72   read means we'r
241e0 65 20 22 63 72 65 61 74 69 6e 67 22 20 74 68 65  e "creating" the
241f0 20 63 6f 6e 63 68 20 28 65 76 65 6e 20 74 68 6f   conch (even tho
24200 75 67 68 20 69 74 20 63 6f 75 6c 64 20 0a 20 20  ugh it could .  
24210 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
24220 20 75 73 65 72 2d 69 6e 74 65 72 76 65 6e 74 69   user-interventi
24230 6f 6e 29 2c 20 69 66 20 77 65 20 61 63 71 75 69  on), if we acqui
24240 72 65 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  re the exclusive
24250 20 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20   lock,.      ** 
24260 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 6d 61 74  we'll try to mat
24270 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  ch the current o
24280 6e 2d 64 69 73 6b 20 70 65 72 6d 69 73 73 69 6f  n-disk permissio
24290 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ns of the databa
242a0 73 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  se.      */.    
242b0 20 20 73 79 6e 63 50 65 72 6d 73 20 3d 20 31 3b    syncPerms = 1;
242c0 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
242d0 2f 2a 20 65 69 74 68 65 72 20 63 6f 6e 63 68 20  /* either conch 
242e0 77 61 73 20 65 6d 74 70 79 20 6f 72 20 64 69 64  was emtpy or did
242f0 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
24300 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
24310 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
24320 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50     proxyGetLockP
24330 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ath(pCtx->dbPath
24340 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  , lockPath, MAXP
24350 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 74  ATHLEN);.      t
24360 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
24370 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72 6c 63  ath;.      strlc
24380 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48 4f  py(&testValue[HO
24390 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50 61  STIDLEN], lockPa
243a0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
243b0 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
243c0 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
243d0 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
243e0 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
243f0 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
24400 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61 73 20  ess.     ** has 
24410 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
24420 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20 72 63  ready) */.    rc
24430 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
24440 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
24450 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
24460 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
24470 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
24480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24490 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
244a0 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
244b0 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
244c0 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f 4e 43   testValue, CONC
244d0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
244e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
244f0 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73 20 29  K && syncPerms )
24500 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
24510 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
24520 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74     int err = fst
24530 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
24540 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
24550 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
24560 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
24570 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
24580 20 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e   file permission
24590 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72  s, ignore failur
245a0 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
245b0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
245c0 20 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64            fchmod
245d0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
245e0 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23 65 6c  uf.st_mode);.#el
245f0 73 65 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  se.          if(
24600 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c   fchmod(conchFil
24610 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64  e->h, buf.st_mod
24620 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
24630 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
24640 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
24650 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
24660 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41  r, "fchmod %o FA
24670 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c  ILED with %d %s\
24680 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20 63 6f   buf.st_mode, co
246b0 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
246c0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  e));.          }
246d0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
246e0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
246f0 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53  rr, "fchmod %o S
24700 55 43 43 45 44 45 44 5c 6e 22 2c 62 75 66 2e 73  UCCEDED\n",buf.s
24710 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  t_mode);.       
24720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
24730 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
24740 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
24750 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
24760 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
24770 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
24780 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
247b0 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
247c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
247d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
247e0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
247f0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
24800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
24810 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
24820 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64 5f 74  _LOCK);.  .end_t
24830 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 4f 53  akeconch:.    OS
24840 54 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f  TRACE2("TRANSPRO
24850 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
24860 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  , pFile->h);.   
24870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24880 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65  OK && pFile->ope
24890 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  nFlags ){.      
248a0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
248b0 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54  ){.#ifdef STRICT
248c0 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20  _CLOSE_ERROR.   
248d0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70       if( close(p
248e0 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20  File->h) ){.    
248f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
24900 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
24910 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
24920 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
24930 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  OSE;.        }.#
24940 65 6c 73 65 0a 20 20 20 20 20 20 20 20 63 6c 6f  else.        clo
24950 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a  se(pFile->h); /*
24960 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66   silently leak f
24970 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e  d if fail */.#en
24980 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
24990 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
249a0 0a 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20  .      int fd = 
249b0 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
249c0 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
249d0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
249e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
249f0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
24a00 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
24a10 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53   OSTRACE2("TRANS
24a20 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
24a30 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20 69  n", fd);.      i
24a40 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
24a50 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66      pFile->h = f
24a60 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
24a70 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54          rc=SQLIT
24a80 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2a 20 53  E_CANTOPEN; /* S
24a90 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78  QLITE_BUSY? prox
24aa0 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65  yTakeConch calle
24ab0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
24ae0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
24af0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24b00 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d  ITE_OK && !pCtx-
24b10 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20  >lockProxy ){.  
24b20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d      char *path =
24b30 20 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74 4c 6f   tLockPath ? tLo
24b40 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
24b50 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
24b60 20 20 20 20 2f 2a 20 41 43 53 3a 20 4e 65 65 64      /* ACS: Need
24b70 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
24b80 6f 66 20 70 61 74 68 20 73 6f 6d 65 74 69 6d 65  of path sometime
24b90 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  s */.      rc = 
24ba0 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
24bb0 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d  ile(path, &pCtx-
24bc0 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  >lockProxy);.   
24bd0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
24be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24bf0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
24c00 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66  d = 1;..      if
24c10 28 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  ( tLockPath ){. 
24c20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
24c30 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
24c40 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
24c50 74 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  tLockPath);.    
24c60 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
24c70 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
24c80 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
24c90 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28  s ){.          (
24ca0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
24cb0 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50  xt *)pCtx->lockP
24cc0 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  roxy->lockingCon
24cd0 74 65 78 74 29 2d 3e 64 62 50 61 74 68 20 3d 0a  text)->dbPath =.
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50       pCtx->lockP
24d00 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
24d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24d20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 63  } else {.      c
24d30 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
24d40 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
24d50 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
24d60 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
24d70 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
24d80 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  3("TAKECONCH  %d
24d90 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
24da0 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49 54 45  e->h, rc==SQLITE
24db0 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64  _OK?"ok":"failed
24dc0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ");.    return r
24dd0 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
24de0 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61  If pFile holds a
24df0 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68   lock on a conch
24e00 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65   file, then rele
24e10 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a  ase that lock..*
24e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
24e30 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75  xyReleaseConch(u
24e40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
24e50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e70 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
24e80 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72  urn code */.  pr
24e90 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
24ea0 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65  t *pCtx;  /* The
24eb0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
24ec0 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c   for the proxy l
24ed0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ock */.  unixFil
24ee0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
24ef0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24f00 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
24f10 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f  /..  pCtx = (pro
24f20 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
24f30 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
24f40 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63  gContext;.  conc
24f50 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
24f60 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41  nchFile;.  OSTRA
24f70 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE4("RELEASECONC
24f80 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
24f90 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
24fa0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
24fb0 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
24fc0 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
24fd0 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
24fe0 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20  auto:"), .      
24ff0 20 20 20 20 20 67 65 74 70 69 64 28 29 29 3b 0a       getpid());.
25000 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
25010 64 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 63 6f  d = 0;.  rc = co
25020 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
25030 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
25040 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
25050 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
25060 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45 41 53  OSTRACE3("RELEAS
25070 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
25080 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
25090 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
250a0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
250b0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
250c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
250d0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
250e0 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
250f0 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20  e file, compute 
25100 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20  the name of its 
25110 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53  conch file..** S
25120 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66  tore the conch f
25130 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72  ilename in memor
25140 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
25150 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
25160 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63  ..** Make *pConc
25170 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74  hPath point to t
25180 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65  he new name.  Re
25190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
251a0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
251b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
251c0 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e  unable to obtain
251d0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
251e0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
251f0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
25200 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61  uring that the a
25210 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
25220 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e  ** space is even
25230 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  tually freed..**
25240 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  .** *pConchPath 
25250 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
25260 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
25270 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
25280 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
25290 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  t proxyCreateCon
252a0 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20  chPathname(char 
252b0 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a  *dbPath, char **
252c0 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69  pConchPath){.  i
252d0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
25300 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74    int len = (int
25310 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
25320 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61   /* Length of da
25330 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
25340 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68  - dbPath */.  ch
25350 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20  ar *conchPath;  
25360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
25370 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
25380 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63  o construct conc
25390 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20  h name */..  /* 
253a0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
253b0 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
253c0 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61  ename and initia
253d0 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  lize the name to
253e0 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
253f0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
25400 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
25410 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68    .  *pConchPath
25420 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28   = conchPath = (
25430 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
25440 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a  alloc(len + 8);.
25450 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d    if( conchPath=
25460 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
25470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25480 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63   }.  memcpy(conc
25490 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c  hPath, dbPath, l
254a0 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  en+1);.  .  /* n
254b0 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20  ow insert a "." 
254c0 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
254d0 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  / character */. 
254e0 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b   for( i=(len-1);
254f0 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20   i>=0; i-- ){.  
25500 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b    if( conchPath[
25510 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
25520 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61   i++;.      brea
25530 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  k;.    }.  }.  c
25540 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b  onchPath[i]='.';
25550 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e  .  while ( i<len
25560 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74   ){.    conchPat
25570 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d  h[i+1]=dbPath[i]
25580 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
25590 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20    /* append the 
255a0 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20  "-conch" suffix 
255b0 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
255c0 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61   memcpy(&conchPa
255d0 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68  th[i+1], "-conch
255e0 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 7);.  assert(
255f0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e   (int)strlen(con
25600 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37  chPath) == len+7
25610 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
25620 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
25630 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f  Takes a fully co
25640 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c  nfigured proxy l
25650 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69  ocking-style uni
25660 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63  x file and switc
25670 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  hes.** the local
25680 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
25690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
256a0 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
256b0 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  th(unixFile *pFi
256c0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
256d0 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
256e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
256f0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
25700 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
25710 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
25720 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61  t;.  char *oldPa
25730 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
25740 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20  roxyPath;.  int 
25750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25760 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
25770 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
25780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
25790 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20  LITE_BUSY;.  }  
257a0 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74  ..  /* nothing t
257b0 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68  o do if the path
257c0 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a   is NULL, :auto:
257d0 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20   or matches the 
257e0 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f  existing path */
257f0 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
25800 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
25810 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
25820 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20  :auto:") ||.    
25830 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72  (oldPath && !str
25840 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61  ncmp(oldPath, pa
25850 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
25860 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
25880 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
25890 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
258a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
258b0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
258c0 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78  y=NULL;.    pCtx
258d0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
258e0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
258f0 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  xy!=NULL ){.    
25900 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e    rc=lockProxy->
25910 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
25920 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
25930 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
25940 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25950 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
25960 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
25970 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xy);.    }.    s
25980 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50  qlite3_free(oldP
25990 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e  ath);.    pCtx->
259a0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
259b0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
259c0 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20  0, path);.  }.  
259d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
259e0 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20  ./*.** pFile is 
259f0 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
25a00 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
25a10 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c   prior xOpen cal
25a20 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73  l.  dbPath.** is
25a30 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
25a40 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54   at least MAXPAT
25a50 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72  HLEN+1 character
25a60 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
25a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69   This routine fi
25a80 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  nd the filename 
25a90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25aa0 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73  pFile and writes
25ab0 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74   it.** int dbPat
25ac0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
25ad0 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
25ae0 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
25af0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
25b00 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64   *dbPath){.#if d
25b10 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25b20 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ).  if( pFile->p
25b30 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
25b40 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
25b50 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70  * afp style keep
25b60 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
25b70 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20   the db path in 
25b80 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65  the filePath fie
25b90 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ld .    ** of th
25ba0 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20  e struct */.    
25bb0 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
25bc0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
25bd0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25be0 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
25bf0 0a 20 20 20 20 73 74 72 63 70 79 28 64 62 50 61  .    strcpy(dbPa
25c00 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67  th, ((afpLocking
25c10 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
25c20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
25c30 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ->dbPath);.  }el
25c40 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
25c50 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
25c60 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
25c70 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ods ){.    /* do
25c80 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65  t lock style use
25c90 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
25ca0 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
25cb0 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20  he dot lock.    
25cc0 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  ** file path */.
25cd0 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
25ce0 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69  rlen((char *)pFi
25cf0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
25d00 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54  xt) - strlen(DOT
25d10 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20  LOCK_SUFFIX);.  
25d20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c    memcpy(dbPath,
25d30 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
25d40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
25d50 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73  len + 1);.  }els
25d60 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74  e{.    /* all ot
25d70 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74  her styles use t
25d80 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
25d90 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
25da0 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  db file path */.
25db0 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
25dc0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
25dd0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
25de0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
25df0 20 20 20 20 73 74 72 63 70 79 28 64 62 50 61 74      strcpy(dbPat
25e00 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
25e10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25e20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25e40 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72  .** Takes an alr
25e50 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75  eady filled in u
25e60 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74  nix file and alt
25e70 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69  ers it so all fi
25e80 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77  le locking .** w
25e90 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64  ill be performed
25ea0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72   on the local pr
25eb0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20  oxy lock file.  
25ec0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
25ed0 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73  elds.** are pres
25ee0 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63  erved in the loc
25ef0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20  king context so 
25f00 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
25f10 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a   restored and .*
25f20 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63  * the unix struc
25f30 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c  ture properly cl
25f40 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73  eaned up at clos
25f50 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f  e time:.**  ->lo
25f60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20  ckingContext.** 
25f70 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74   ->pMethod.*/.st
25f80 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
25f90 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
25fa0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
25fb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
25fc0 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  h) {.  proxyLock
25fd0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
25fe0 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b  ;.  char dbPath[
25ff0 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20  MAXPATHLEN+1];  
26000 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26020 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
26030 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e  kPath=NULL;.  in
26040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26050 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65  ;.  .  if( pFile
26060 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
26070 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
26080 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
26090 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50   }.  proxyGetDbP
260a0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
260b0 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
260c0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
260d0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
260e0 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
260f0 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
26100 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
26110 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
26120 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
26130 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
26140 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E4("TRANSPROXY  
26150 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
26160 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
26170 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
26180 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
26190 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
261a0 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d  id());..  pCtx =
261b0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
261c0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
261d0 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
261e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
261f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
26200 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30    memset(pCtx, 0
26210 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29  , sizeof(*pCtx))
26220 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43  ;..  rc = proxyC
26230 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
26240 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78  me(dbPath, &pCtx
26250 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
26260 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
26270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
26280 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
26290 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63  xFile(pCtx->conc
262a0 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78  hFilePath, &pCtx
262b0 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
262c0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
262d0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
262e0 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
262f0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
26300 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
26310 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
26320 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
26330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
26340 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20  * all memory is 
26350 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79  allocated, proxy
26360 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e  s are created an
26370 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20  d assigned, .   
26380 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c   ** switch the l
26390 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
263a0 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
263b0 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20  return..    */. 
263c0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
263d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
263e0 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
263f0 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69    pCtx->oldLocki
26400 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c  ngContext = pFil
26410 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
26420 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  t;.    pFile->lo
26430 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
26440 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70  Ctx;.    pCtx->p
26450 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c  OldMethod = pFil
26460 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20  e->pMethod;.    
26470 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
26480 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
26490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
264a0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  f( pCtx->conchFi
264b0 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  le ){ .      rc 
264c0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
264d0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
264e0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
264f0 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   *)pCtx->conchFi
26500 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
26510 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26530 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
26540 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
26550 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
26560 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
26570 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
26580 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
26590 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50  OSTRACE3("TRANSP
265a0 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
265b0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
265c0 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
265d0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
265e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
265f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
26600 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
26610 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
26620 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
26630 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
26640 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
26650 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
26660 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
26670 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
26680 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
26690 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
266a0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
266b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
266c0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
266d0 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
266e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
266f0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
26700 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
26710 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
26720 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
26730 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
26740 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
26750 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
26760 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
26770 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
26780 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
26790 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
267a0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
267b0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
267c0 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
267d0 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
267e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
267f0 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
26800 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
26810 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
26820 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
26830 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
26840 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
26850 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
26860 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
26870 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
26880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26890 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
268a0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
268b0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
268c0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
268d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
268e0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
268f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26900 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
26910 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
26920 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
26930 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
26940 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
26950 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
26960 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
26970 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
26980 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
26990 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
269a0 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
269b0 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
269c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
269d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
269e0 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
269f0 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
26a00 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
26a10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26a20 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
26a30 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
26a40 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
26a50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26a60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
26a70 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
26a80 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
26a90 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
26aa0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
26ab0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
26ac0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
26ad0 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
26ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
26af0 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
26b00 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
26b10 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
26b20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
26b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
26b40 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
26b50 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
26b60 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
26b70 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
26b90 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
26ba0 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
26bb0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
26bc0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26bf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26c00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
26c10 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
26c20 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
26c30 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
26c40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
26c60 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
26c70 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
26c80 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
26c90 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
26ca0 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
26cb0 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
26cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
26cd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26ce0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
26cf0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
26d00 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
26d10 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
26d20 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
26d30 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
26d40 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
26d50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
26d60 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
26d70 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
26d80 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
26d90 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
26da0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
26db0 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
26dc0 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
26dd0 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
26de0 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
26df0 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
26e00 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
26e10 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
26e20 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
26e30 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
26e40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
26e50 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
26e60 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
26e70 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
26e80 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
26e90 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
26ea0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
26eb0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
26ec0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
26ed0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
26ee0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
26ef0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
26f00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
26f10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
26f20 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
26f30 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
26f40 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
26f50 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
26f60 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
26f70 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
26f80 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
26f90 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
26fa0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
26fb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
26fc0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
26fd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
26fe0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
26ff0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
27010 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
27020 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
27030 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
27040 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
27050 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78  ontext;.    unix
27060 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
27070 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
27080 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d     return proxy-
27090 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b  >pMethod->xCheck
270a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71  ReservedLock((sq
270b0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
270c0 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 7d  y, pResOut);.  }
270d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
270e0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
270f0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
27100 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
27110 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
27120 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
27130 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
27140 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
27150 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
27160 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
27170 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
27180 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
27190 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
271a0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
271b0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
271c0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
271d0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
271e0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
271f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
27200 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
27210 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
27220 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
27230 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
27240 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
27250 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
27260 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
27270 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
27280 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
27290 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
272a0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
272b0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
272c0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
272d0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
272e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
272f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
27300 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
27310 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
27320 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
27330 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
27340 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
27350 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
27360 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
27370 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
27380 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
27390 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
273a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
273b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
273c0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
273d0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
273e0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
273f0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
27400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
27410 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
27420 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
27430 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
27440 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
27450 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
27460 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
27470 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
27480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27490 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
274a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
274b0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
274c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
274d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
274e0 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  ext;.    unixFil
274f0 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
27500 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
27510 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
27520 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
27530 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
27540 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
27550 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
27560 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70  = proxy->locktyp
27570 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
27580 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
27590 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
275a0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
275b0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
275c0 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
275d0 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
275e0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
275f0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
27600 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
27610 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
27620 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27630 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
27640 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
27650 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
27660 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
27670 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
27680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27690 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
276a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
276b0 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
276c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
276d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
276e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
276f0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
27700 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
27720 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
27730 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
27740 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
27750 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
27760 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78  ontext;.    unix
27770 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
27780 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
27790 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
277a0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
277b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
277c0 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  roxy, locktype);
277d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
277e0 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f  type = proxy->lo
277f0 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65  cktype;.  }.  re
27800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27810 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74  * Close a file t
27820 68 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c  hat uses proxy l
27830 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
27840 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
27850 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
27860 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
27870 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
27880 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
27890 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63  id;.    proxyLoc
278a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
278b0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
278c0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
278d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
278e0 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
278f0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
27900 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
27910 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
27920 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
27930 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  chFile;.    int 
27940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27950 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63      .    if( loc
27960 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
27970 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
27980 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
27990 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
279a0 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f  lockProxy, NO_LO
279b0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
279c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
279d0 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72       rc = lockPr
279e0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
279f0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
27a00 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  le*)lockProxy);.
27a10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
27a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27a30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
27a40 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70  kProxy);.      p
27a50 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d  Ctx->lockProxy =
27a60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
27a70 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20  ( conchFile ){. 
27a80 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63       if( pCtx->c
27a90 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20  onchHeld ){.    
27aa0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65      rc = proxyRe
27ab0 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65  leaseConch(pFile
27ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27ad0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
27af0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
27b00 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
27b10 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
27b20 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  hFile);.      if
27b30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
27b40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27b50 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b  free(conchFile);
27b60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27b70 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f  e3_free(pCtx->lo
27b80 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
27b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27ba0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
27bb0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
27bc0 5f 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61  _free(pCtx->dbPa
27bd0 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74  th);.    /* rest
27be0 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ore the original
27bf0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
27c00 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
27c10 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20  n close it */.  
27c20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67    pFile->locking
27c30 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e  Context = pCtx->
27c40 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
27c50 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  t;.    pFile->pM
27c60 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f  ethod = pCtx->pO
27c70 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71  ldMethod;.    sq
27c80 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
27c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69  ;.    return pFi
27ca0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
27cb0 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ose(id);.  }.  r
27cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27cd0 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .}....#endif /* 
27ce0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27cf0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
27d00 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27d10 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  E */./*.** The p
27d20 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79  roxy locking sty
27d30 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  le is intended f
27d40 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20  or use with AFP 
27d50 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20  filesystems..** 
27d60 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73  And since AFP is
27d70 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
27d80 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70  on MacOSX, the p
27d90 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
27da0 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74  also.** restrict
27db0 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a  ed to MacOSX..**
27dc0 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
27dd0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
27de0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69  the proxy lock i
27df0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
27e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e10 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
27e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e60 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ***/../*.** Init
27e70 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
27e80 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
27e90 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rface..**.** Thi
27ea0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
27eb0 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c  ers all VFS impl
27ec0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
27ed0 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74  unix-like operat
27ee0 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20  ing.** systems. 
27ef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   This routine, a
27f00 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f  nd the sqlite3_o
27f10 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20  s_end() routine 
27f20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a  that follows,.**
27f30 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f   should be the o
27f40 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  nly routines in 
27f50 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61  this file that a
27f60 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20  re visible from 
27f70 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a  other.** files..
27f80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
27f90 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
27fa0 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  e during SQLite 
27fb0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61  initialization a
27fc0 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c  nd by a.** singl
27fd0 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d  e thread.  The m
27fe0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
27ff0 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79   and mutex subsy
28000 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a  stems have not.*
28010 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65  * necessarily be
28020 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  en initialized w
28030 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28040 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20   is called, and 
28050 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  so they.** shoul
28060 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a  d not be used..*
28070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
28080 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20  _init(void){ .  
28090 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  /* .  ** The fol
280a0 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66  lowing macro def
280b0 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ines an initiali
280c0 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74  zer for an sqlit
280d0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20  e3_vfs object.. 
280e0 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   ** The name of 
280f0 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e  the VFS is NAME.
28100 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69    The pAppData i
28110 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
28120 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f   pointer.  ** to
28130 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75   the "finder" fu
28140 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61  nction.  (pAppDa
28150 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
28160 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63  to a pointer bec
28170 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20  ause.  ** silly 
28180 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62  C90 rules prohib
28190 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20  it a void* from 
281a0 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20  being cast to a 
281b0 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
281c0 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20  .  ** and so we 
281d0 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75  have to go throu
281e0 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  gh the intermedi
281f0 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  ate pointer to a
28200 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20  void problems.  
28210 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
28220 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  g with -pedantic
28230 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29  -errors on GCC.)
28240 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46  .  **.  ** The F
28250 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20  INDER parameter 
28260 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
28270 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
28280 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
28290 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63    ** finder-func
282a0 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65  tion.  The finde
282b0 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  r-function retur
282c0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
282d0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
282e0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
282f0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
28300 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f  s the desired lo
28310 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76  cking.  ** behav
28320 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64  iors.  See the d
28330 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68  ivision above th
28340 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
28350 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d  IOMETHODS.  ** m
28360 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f  acro for additio
28370 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  n information on
28380 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28390 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73  s..  **.  ** Mos
283a0 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79  t finders simply
283b0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
283c0 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
283d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
283e0 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75    ** object.  Bu
283f0 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49  t the "autolockI
28400 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62  oFinder" availab
28410 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65  le on MacOSX doe
28420 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20  s a little.  ** 
28430 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20  more than that; 
28440 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  it looks at the 
28450 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
28460 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a  that hosts the .
28470 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
28480 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  le and tries to 
28490 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e  choose an lockin
284a0 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72  g method appropr
284b0 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68  iate for.  ** th
284c0 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69  at filesystem ti
284d0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69  me..  */.  #defi
284e0 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41  ne UNIXVFS(VFSNA
284f0 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20  ME, FINDER) {   
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20       \.    1,   
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28     \.    sizeof(
28560 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f  unixFile),     /
28570 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20  * szOsFile */   
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e   \.    MAX_PATHN
285a0 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  AME,         /* 
285b0 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20  mxPathname */   
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
285d0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
285e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
285f0 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ext */          
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28610 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20     VFSNAME,     
28620 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
28630 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28640 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28650 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c   (void*)&FINDER,
28660 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
28670 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ta */           
28680 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
28690 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nixOpen,        
286a0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
286d0 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  xDelete,        
286e0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41       \.    unixA
28710 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
28720 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20   /* xAccess */  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c     \.    unixFul
28750 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
28760 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
28770 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28780 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65   \.    unixDlOpe
28790 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
287a0 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20  xDlOpen */      
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
287c0 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72  .    unixDlError
287d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
287e0 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  lError */       
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28800 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20     unixDlSym,   
28810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
28820 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ym */           
28830 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28840 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20   unixDlClose,   
28850 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
28860 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
28870 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
28880 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  nixRandomness,  
28890 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
288a0 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
288b0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
288c0 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  xSleep,         
288d0 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20     /* xSleep */ 
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
28900 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
28910 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
28920 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28930 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74     \.    unixGet
28940 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f  LastError      /
28950 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
28960 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28970 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   \.  }..  /*.  *
28980 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46  * All default VF
28990 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65  Ses for unix are
289a0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
289b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
289c0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  y..  **.  ** Not
289d0 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  e that the sqlit
289e0 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65  e3_vfs.pNext fie
289f0 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62  ld of the VFS ob
28a00 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ject is modified
28a10 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c  .  ** by the SQL
28a20 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68  ite core when th
28a30 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65  e VFS is registe
28a40 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c  red.  So the fol
28a50 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61  lowing.  ** arra
28a60 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73  y cannot be cons
28a70 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  t..  */.  static
28a80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
28a90 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49  s[] = {.#if SQLI
28aa0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
28ab0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
28ac0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
28ad0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
28ae0 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c  ,          autol
28af0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
28b00 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53  else.    UNIXVFS
28b10 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
28b20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
28b30 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e  ),.#endif.    UN
28b40 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65  IXVFS("unix-none
28b50 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ",     nolockIoF
28b60 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
28b70 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69  XVFS("unix-dotfi
28b80 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  le",  dotlockIoF
28b90 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f  inder ),.#if OS_
28ba0 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
28bb0 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73  VFS("unix-nameds
28bc0 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72  em", semIoFinder
28bd0 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   ),.#endif.#if S
28be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28bf0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55  KING_STYLE.    U
28c00 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73  NIXVFS("unix-pos
28c10 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46  ix",    posixIoF
28c20 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
28c30 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
28c40 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  ",    flockIoFin
28c50 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69  der ),.#endif.#i
28c60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28c70 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
28c80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28c90 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28  __).    UNIXVFS(
28ca0 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20  "unix-afp",     
28cb0 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a   afpIoFinder ),.
28cc0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
28cd0 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f  x-proxy",    pro
28ce0 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  xyIoFinder ),.#e
28cf0 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  ndif.  };.  unsi
28d00 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20  gned int i;     
28d10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28d20 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  nter */..  /* Re
28d30 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
28d40 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
28d50 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  aVfs[] array */.
28d60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69    for(i=0; i<(si
28d70 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f  zeof(aVfs)/sizeo
28d80 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
28d90 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
28da0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
28db0 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b  &aVfs[i], i==0);
28dc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28dd0 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
28de0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
28df0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
28e00 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
28e10 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  * Some operating
28e20 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e   systems might n
28e30 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63  eed to do some c
28e40 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72  leanup in this r
28e50 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65  outine,.** to re
28e60 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c  lease dynamicall
28e70 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65  y allocated obje
28e80 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e  cts.  But not on
28e90 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72   unix..** This r
28ea0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
28eb0 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69  p for unix..*/.i
28ec0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  nt sqlite3_os_en
28ed0 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75  d(void){ .  retu
28ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
28ef0 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  . .#endif /* SQL
28f00 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a     ITE_OS_UNIX */.