/ Hex Artifact Content
Login

Artifact c74255cc1fcddc38fc3cc1dcf70c2325d3c2948e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a 0a  e3_os_end()..**.
07f0: 2a 2a 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78 2e  ** $Id: os_unix.
0800: 63 2c 76 20 31 2e 32 33 38 20 32 30 30 39 2f 30  c,v 1.238 2009/0
0810: 31 2f 31 36 20 32 33 3a 34 37 3a 34 32 20 64 72  1/16 23:47:42 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 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
1860: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61        /* The fla
1880: 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74 20  gs specified at 
1890: 6f 70 65 6e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  open */.#if SQLI
18a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
18b0: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
18c0: 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74 20  __).  pthread_t 
18d0: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
18e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
18f0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
1900: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
1910: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
1920: 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69 73  VXWORKS.  int is
1930: 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20  Delete;         
1940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1950: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
1960: 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72 75 63   true */.  struc
1970: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1980: 2a 70 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 55  *pId;       /* U
1990: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
19a0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19b0: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
19c0: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
19d0: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
19e0: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
19f0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
1a00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1a10: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
1a20: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
1a30: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
1a40: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
1a50: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1a60: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
1a70: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
1a80: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
1a90: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
1aa0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
1ab0: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
1ac0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1ad0: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
1ae0: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
1af0: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
1b00: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
1b10: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
1b20: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
1b30: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
1b40: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b50: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
1b60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1b70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1b80: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
1b90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ba0: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
1bb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
1bc0: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
1bd0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
1be0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bf0: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
1c00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
1c10: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1c20: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
1c30: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1c40: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
1c50: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
1c60: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1c70: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
1c80: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
1c90: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
1ca0: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
1cb0: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
1cc0: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
1cd0: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
1ce0: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
1cf0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
1d00: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
1d10: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
1d20: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
1d30: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
1d40: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
1d50: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
1d60: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
1d70: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
1d80: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
1d90: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
1da0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
1db0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1dc0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
1dd0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
1de0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
1df0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
1e00: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
1e10: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
1e20: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
1e30: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
1e40: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
1e50: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
1e60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
1e70: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
1e80: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
1e90: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
1ea0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
1eb0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1ec0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
1ed0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
1ee0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
1ef0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
1f00: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
1f10: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
1f20: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
1f30: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
1f40: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
1f50: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
1f60: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
1f70: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
1f80: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
1f90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1fa0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
1fb0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
1fc0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
1fd0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
1fe0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
1ff0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2000: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2010: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2020: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2030: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2040: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2050: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  ndif.../*.** Hel
2060: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
2070: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
2080: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
2090: 6c 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74  l mutex..*/.stat
20a0: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
20b0: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
20c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
20d0: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
20e0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
20f0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
2100: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
2110: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
2120: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
2130: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
2140: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
2150: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
2160: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
2170: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2180: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  DEBUG./*.** Help
2190: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
21a0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
21b0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
21c0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
21d0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
21e0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
21f0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
2200: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
2210: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
2220: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
2230: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63   const char *loc
2240: 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f  ktypeName(int lo
2250: 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63  cktype){.  switc
2260: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
2270: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
2280: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
2290: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
22a0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
22b0: 22 3b 0a 20 20 63 61 73 65 20 52 45 53 45 52 56  ";.  case RESERV
22c0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
22d0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 63 61  "RESERVED";.  ca
22e0: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
22f0: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
2300: 22 3b 0a 20 20 63 61 73 65 20 45 58 43 4c 55 53  ";.  case EXCLUS
2310: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
2320: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
2330: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
2340: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
2350: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
2360: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
2370: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
2380: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
2390: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
23a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
23c0: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
23d0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
23e0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
23f0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
2400: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
2410: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
2420: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
2430: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
2440: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
2450: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
2460: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
2470: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2480: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
2490: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
24a0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
24b0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
24c0: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
24d0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
24e0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
24f0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2500: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
2510: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
2520: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
2530: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
2540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
2550: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
2560: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
2570: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2580: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
2590: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
25a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
25b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
25c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
25d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
25e0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
25f0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
2600: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
2610: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
2620: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
2630: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2640: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2650: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2660: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
2670: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
2680: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
2690: 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c  T );.  s = fcntl
26a0: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73  (fd, op, p);.  s
26b0: 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e  avedErrno = errn
26c0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  o;.  sqlite3Debu
26d0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25  gPrintf("fcntl %
26e0: 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64  d %d %s %s %d %d
26f0: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2700: 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f  threadid, fd, zO
2710: 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69  pName, zType, (i
2720: 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28  nt)p->l_start, (
2730: 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20  int)p->l_len,.  
2740: 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64     (int)p->l_pid
2750: 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28  , s);.  if( s==(
2760: 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54  -1) && op==F_SET
2770: 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65  LK && (p->l_type
2780: 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e  ==F_RDLCK || p->
2790: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29  l_type==F_WRLCK)
27a0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
27b0: 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20  lock l2;.    l2 
27c0: 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28  = *p;.    fcntl(
27d0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
27e0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
27f0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2800: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
2810: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
2820: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
2830: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
2840: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2850: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2860: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
2870: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2880: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
2890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28a0: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
28b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
28c0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
28d0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
28e0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
28f0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
2900: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
2910: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
2920: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
2930: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
2940: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
2950: 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63   s;.}.#define fc
2960: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
2970: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
2980: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a  OCK_TRACE */....
2990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29a0: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
29b0: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
29c0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
29d0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
29e0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
29f0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
2a00: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
2a10: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
2a20: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
2a30: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
2a40: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
2a50: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
2a60: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
2a70: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
2a80: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
2a90: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2aa0: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
2ab0: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
2ac0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
2ad0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2ae0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
2af0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
2b00: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
2b10: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
2b20: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
2b30: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
2b40: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
2b50: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2b60: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
2b70: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
2b80: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
2b90: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
2ba0: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20  (posixError) {. 
2bb0: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
2bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bd0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 47 41      .  case EAGA
2be0: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
2bf0: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
2c00: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
2c10: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
2c20: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
2c30: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
2c40: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
2c50: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
2c60: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
2c70: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
2c80: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
2c90: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
2ca0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
2cb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2cc0: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
2cd0: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
2ce0: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
2cf0: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
2d00: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
2d10: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
2d20: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
2d30: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
2d40: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
2d50: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
2d60: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2d70: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
2d80: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
2d90: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
2da0: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
2db0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
2dc0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
2dd0: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
2de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2df0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
2e00: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
2e10: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
2e20: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
2e30: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
2e40: 20 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b   .  case EDEADLK
2e50: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
2e60: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2e70: 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  D;.    .#if EOPN
2e80: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
2e90: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
2ea0: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
2eb0: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
2ec0: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
2ed0: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
2ee0: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
2ef0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
2f00: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
2f10: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
2f20: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
2f30: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
2f40: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
2f50: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
2f60: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
2f70: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
2f80: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
2f90: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
2fa0: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
2fb0: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
2fc0: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
2fd0: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
2fe0: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
2ff0: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
3000: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
3010: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
3020: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
3030: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
3040: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
3050: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
3060: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
3070: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
3080: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
3090: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
30a0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
30b0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
30c0: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
30d0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3130: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
3140: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
3150: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
3160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3170: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
3180: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
3190: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
31a0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
31b0: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
31c0: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
31d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
31e0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
31f0: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
3200: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
3210: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
3220: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
3230: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
3240: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
3250: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
3260: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
3270: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3290: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
32a0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
32b0: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
32c0: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
32d0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
32e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
32f0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
3300: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
3310: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
3320: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
3330: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
3340: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
3350: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
3360: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3370: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
3380: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
3390: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
33a0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
33b0: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
33c0: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
33d0: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
33e0: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
33f0: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
3400: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
3410: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
3420: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
3430: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
3440: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
3450: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3460: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
3470: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
3480: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
3490: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
34c0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
34d0: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
34e0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
34f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
3500: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
3510: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
3520: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
3530: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
3540: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
3550: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
3560: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
3570: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
3580: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
3590: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
35a0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
35b0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
35c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
35d0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
35e0: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
35f0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
3600: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
3610: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
3620: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
3630: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
3640: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
3650: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
3660: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
3670: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
3680: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
3690: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
36a0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
36b0: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
36c0: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
36d0: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
36e0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
36f0: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
3700: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
3710: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
3720: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
3730: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
3740: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
3750: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
3760: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
3770: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
3780: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
3790: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
37a0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
37b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
37c0: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
37d0: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
37e0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
37f0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
3800: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
3810: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3820: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
3830: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
3840: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
3850: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
3860: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
3870: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3880: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3890: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
38a0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
38b0: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
38c0: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
38d0: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
38e0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
38f0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3900: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
3910: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
3920: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3930: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3940: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
3950: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
3960: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
3970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3980: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3990: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
39a0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
39b0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
39c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
39d0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
39e0: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
39f0: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
3a00: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
3a10: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
3a20: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
3a30: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
3a40: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
3a50: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
3a60: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
3a70: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
3a80: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
3a90: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
3aa0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
3ab0: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
3ac0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
3ad0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3ae0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
3af0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
3b00: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
3b10: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
3b20: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
3b30: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
3b40: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
3b50: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
3b60: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
3b70: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
3b80: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
3b90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3ba0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
3bb0: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
3bc0: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
3bd0: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
3be0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3c10: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
3c20: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
3c30: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
3c40: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
3c50: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
3c60: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
3c70: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
3c80: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
3c90: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
3ca0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3cb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3cc0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
3cd0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
3ce0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
3cf0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
3d00: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
3d10: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
3d20: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
3d30: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
3d40: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
3d50: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
3d60: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
3d70: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
3d80: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
3d90: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
3da0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
3db0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
3dc0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
3dd0: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
3de0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
3df0: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
3e00: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
3e10: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
3e20: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
3e30: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
3e40: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
3e50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3e60: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
3e70: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
3e80: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
3e90: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3ea0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
3eb0: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
3ec0: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
3ed0: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
3ee0: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
3ef0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
3f00: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
3f10: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
3f20: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
3f30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
3f40: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
3f50: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
3f60: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
3f70: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
3f80: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
3f90: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
3fa0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
3fb0: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
3fc0: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
3fd0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
3fe0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
3ff0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
4000: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4010: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
4020: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4030: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
4040: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
4050: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4060: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
4070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4080: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
4090: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
40a0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
40b0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
40c0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
40d0: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
40e0: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
40f0: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
4100: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
4110: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
4120: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
4130: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
4140: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
4150: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
4160: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
4170: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
4180: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
4190: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
41a0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
41b0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
41c0: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
41d0: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
41f0: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
4200: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
4210: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
4220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
4280: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
42d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
42f0: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
4300: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
4310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4320: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
4330: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
4340: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
4350: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
4360: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
4370: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
4380: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
4390: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
43a0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
43b0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
43c0: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
43d0: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
43e0: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
43f0: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
4400: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
4410: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
4420: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
4430: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
4440: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
4450: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
4460: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4470: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
4480: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
4490: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
44a0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
44b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
44c0: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
44d0: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
44e0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
44f0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
4500: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
4510: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4520: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
4530: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
4540: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
4550: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
4560: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
4570: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
4580: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
4590: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
45a0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
45b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
45c0: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
45d0: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
45e0: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
45f0: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
4600: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
4610: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
4620: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
4630: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
4640: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
4650: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
4660: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
4670: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
4680: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
4690: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
46a0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
46b0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
46c0: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
46d0: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
46e0: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
46f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4700: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
4710: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
4720: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
4730: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
4740: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
4750: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
4760: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
4770: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
4780: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
4790: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
47a0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
47b0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
47c0: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
47d0: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
47e0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
47f0: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
4800: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
4810: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
4820: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4830: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
4840: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
4850: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
4860: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
4870: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
4880: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
4890: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
48a0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
48b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
48c0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
48d0: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
48e0: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
48f0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
4900: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
4910: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
4920: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
4930: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
4940: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
4950: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
4960: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
4970: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
4980: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
4990: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
49a0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
49b0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
49c0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
49d0: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
49e0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
49f0: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
4a00: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
4a10: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
4a20: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
4a30: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
4a40: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
4a50: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
4a60: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
4a70: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
4a80: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
4a90: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
4aa0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
4ab0: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
4ac0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
4ad0: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
4ae0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
4af0: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
4b00: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
4b10: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
4b20: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
4b30: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
4b40: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
4b50: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
4b60: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
4b70: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
4b80: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
4b90: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
4ba0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
4bb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
4bc0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
4bd0: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
4be0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
4bf0: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
4c00: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
4c10: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
4c20: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
4c30: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
4c40: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
4c50: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
4c60: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
4c70: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
4c80: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
4c90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
4ca0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
4cb0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4cc0: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
4cd0: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
4ce0: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
4cf0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
4d00: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
4d10: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
4d20: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
4d30: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
4d40: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
4d50: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
4d60: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
4d70: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
4d80: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
4d90: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
4da0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
4db0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
4dc0: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
4dd0: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
4de0: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
4df0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
4e00: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
4e10: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
4e20: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
4e30: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
4e40: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
4e50: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
4e60: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
4e70: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
4e80: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
4e90: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
4ea0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
4eb0: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
4ec0: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
4ed0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
4ee0: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
4ef0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
4f00: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
4f10: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
4f20: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
4f30: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
4f40: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
4f50: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
4f60: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
4f70: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
4f80: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
4f90: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
4fa0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
4fb0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
4fc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e  pointer to an un
4fd0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
4fe0: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
4ff0: 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ne unixOpenCnt s
5000: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
5010: 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63  open inode, whic
5020: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c  h means that mul
5030: 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20 63  tiple unixFile c
5040: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  an point to a si
5050: 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e  ngle.** unixOpen
5060: 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74  Cnt.  When an at
5070: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
5080: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
5090: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
50a0: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
50b0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
50c0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
50d0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
50e0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
50f0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
5100: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5110: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
5120: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
5130: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
5140: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
5150: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
5160: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
5170: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
5180: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
5190: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
51a0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
51b0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
51c0: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
51d0: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
51e0: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
51f0: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
5200: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
5210: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
5220: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
5230: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
5240: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
5250: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
5260: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
5270: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
5280: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
5290: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
52a0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
52b0: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
52c0: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
52d0: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
52e0: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
52f0: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
5300: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
5310: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
5320: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
5330: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
5340: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
5350: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
5360: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
5370: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
5380: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
5390: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
53a0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
53b0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
53c0: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
53d0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
53e0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
53f0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
5400: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
5410: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
5420: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
5430: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5440: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
5450: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
5460: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
5470: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
5480: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65   thread B..** We
5490: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72 75   have to do a ru
54a0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
54b0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
54c0: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
54d0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
54e0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d  .**.** On system
54f0: 73 20 77 68 65 72 65 20 74 68 72 65 61 64 20 41  s where thread A
5500: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f   is unable to mo
5510: 64 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61 74  dify locks creat
5520: 65 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64 20  ed by.** thread 
5530: 42 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65  B, we have to ke
5540: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69 63  ep track of whic
5550: 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64  h thread created
5560: 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20   each.** lock.  
5570: 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 61  Hence there is a
5580: 6e 20 65 78 74 72 61 20 66 69 65 6c 64 20 69 6e  n extra field in
5590: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
55a0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  unixLockInfo.** 
55b0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 63  structure to rec
55c0: 6f 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  ord this informa
55d0: 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68  tion.  And on th
55e0: 6f 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a 2a  ose systems it.*
55f0: 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  * is illegal to 
5600: 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  begin a transact
5610: 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65 61  ion in one threa
5620: 64 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74 0a  d and finish it.
5630: 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20  ** in another.  
5640: 46 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72 20  For this latter 
5650: 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68 65  restriction, the
5660: 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72  re is no work-ar
5670: 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61  ound..** It is a
5680: 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c   limitation of L
5690: 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a  inuxThreads..*/.
56a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68  ./*.** Set or ch
56b0: 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65  eck the unixFile
56c0: 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69  .tid field.  Thi
56d0: 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77  s field is set w
56e0: 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a  hen an unixFile.
56f0: 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  ** is first open
5700: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
5710: 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20  ent uses of the 
5720: 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20  unixFile verify 
5730: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
5740: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
5750: 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78  ting on the unix
5760: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
5770: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
5780: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
5790: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
57a0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
57b0: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
57c0: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
57d0: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
57e0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
57f0: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
5800: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5810: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
5820: 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65   while locks are
5830: 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72   held..**.** Ver
5840: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
5850: 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69  -01-15):  unixFi
5860: 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20  le can be moved 
5870: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20  from one thread 
5880: 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73  to.** another as
5890: 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20   long as we are 
58a0: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73  running on a sys
58b0: 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74  tem that support
58c0: 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65  s threads.** ove
58d0: 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68  rriding each oth
58e0: 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68  ers locks (which
58f0: 20 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74   is now the most
5900: 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72   common behavior
5910: 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f  ).** or if no lo
5920: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42  cks are held.  B
5930: 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  ut the unixFile.
5940: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
5950: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
5960: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
5970: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
5980: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
5990: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
59a0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
59b0: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
59c0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
59d0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
59e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
59f0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
5a00: 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
5a10: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29   SET_THREADID(X)
5a20: 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74     (X)->tid = pt
5a30: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
5a40: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
5a50: 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73  ADID(X) (threads
5a60: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5a70: 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a  rsLocks==0 && \.
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68              !pth
5aa0: 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e  read_equal((X)->
5ab0: 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  tid, pthread_sel
5ac0: 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  f())).#else.# de
5ad0: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
5ae0: 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48  D(X).# define CH
5af0: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
5b00: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
5b10: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5b20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5b30: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
5b40: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
5b50: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
5b60: 74 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e  ticular unixOpen
5b70: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69  Cnt structure gi
5b80: 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20  ven its inode.  
5b90: 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73  This.** is the s
5ba0: 61 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78 4c  ame as the unixL
5bb0: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68  ockKey except th
5bc0: 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44  at the thread ID
5bd0: 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a   is omitted..*/.
5be0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
5bf0: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
5c20: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
5c30: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
5c40: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
5c50: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
5c60: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
5c70: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
5c80: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
5c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
5ca0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
5cb0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
5cc0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5cd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5ce0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
5cf0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
5d00: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
5d10: 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ular unixLockInf
5d20: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
5d30: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
5d40: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
5d50: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
5d60: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5d70: 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c 20  (LinuxThreads), 
5d80: 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74  then we.** set t
5d90: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74  he unixLockKey.t
5da0: 69 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  id field to the 
5db0: 74 68 72 65 61 64 20 49 44 2e 20 20 49 66 20 74  thread ID.  If t
5dc0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
5dd0: 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65  ide.** each othe
5de0: 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20  rs locks (Posix 
5df0: 61 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20 74  and NPTL) then t
5e00: 69 64 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  id is always set
5e10: 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64   to zero..** tid
5e20: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 77   is omitted if w
5e30: 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75  e compile withou
5e40: 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70  t threading supp
5e50: 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a  ort or on an OS.
5e60: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69  ** other than li
5e70: 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  nux..*/.struct u
5e80: 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73  nixLockKey {.  s
5e90: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
5ea0: 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65   fid;  /* Unique
5eb0: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
5ec0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20  the file */.#if 
5ed0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
5ee0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
5ef0: 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61  inux__).  pthrea
5f00: 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68 72  d_t tid;  /* Thr
5f10: 65 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f  ead ID of lock o
5f20: 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f  wner. Zero if no
5f30: 74 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68 72  t using LinuxThr
5f40: 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  eads */.#endif.}
5f50: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
5f60: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5f70: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5f80: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
5f90: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
5fa0: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
5fb0: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
5fc0: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
5fd0: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
5fe0: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
5ff0: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
6000: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
6010: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
6020: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
6030: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
6040: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
6050: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
6060: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
6070: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6080: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
6090: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
60a0: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
60b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
60c0: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
60d0: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
60e0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b  t unixLockInfo {
60f0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6100: 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20  ckKey lockKey;  
6110: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
6120: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
6130: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6150: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
6160: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
6170: 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  t locktype;     
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6190: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
61a0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
61b0: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
61c0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
61e0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
61f0: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6200: 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ture */.  struct
6210: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
6220: 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  Next;     /* Lis
6230: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63  t of all unixLoc
6240: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  kInfo objects */
6250: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6260: 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  ckInfo *pPrev;  
6270: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
6280: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 7d  ubly linked */.}
6290: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
62a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
62b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
62c0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
62d0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
62e0: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
62f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
6300: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6310: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
6320: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
6330: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
6340: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
6350: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
6360: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
6370: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
6380: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
6390: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
63a0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
63b0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
63c0: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
63d0: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a 0a  ending list..**.
63e0: 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69 64  ** TODO:  Consid
63f0: 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  er changing this
6400: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
6410: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
6420: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
6430: 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  or for each open
6440: 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65 6e   file, even when
6450: 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d 75   it is opened mu
6460: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a  ltiple times..**
6470: 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79 73   The close() sys
6480: 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20 6f  tem call would o
6490: 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20 74  nly occur when t
64a0: 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73 65  he last database
64b0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66 69  .** using the fi
64c0: 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73 74  le closes..*/.st
64d0: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
64e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
64f0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
6500: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
6510: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
6520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6530: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6540: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
6550: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
6560: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6580: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
6590: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
65a0: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65c0: 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  Number of pendin
65d0: 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74  g close() operat
65e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ions */.  int *a
65f0: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
6600: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
6610: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
6620: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
6630: 6f 73 65 28 29 20 2a 2f 0a 23 69 66 20 4f 53 5f  ose() */.#if OS_
6640: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
6650: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6670: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
6680: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
6690: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
66a0: 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20 4e 61 6d  AME+1];   /* Nam
66b0: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
66c0: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ore */.#endif.  
66d0: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
66e0: 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  nt *pNext, *pPre
66f0: 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  v;   /* List of 
6700: 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  all unixOpenCnt 
6710: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
6720: 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c  *.** Lists of al
6730: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61  l unixLockInfo a
6740: 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f  nd unixOpenCnt o
6750: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 75  bjects.  These u
6760: 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a 2a  sed to be hash.*
6770: 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 74  * tables.  But t
6780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
6790: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
67a0: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
67b0: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
67c0: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
67d0: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
67e0: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
67f0: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73  itical.** path s
6800: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
6810: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
6820: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
6830: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
6840: 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30  fo *lockList = 0
6850: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
6860: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65  unixOpenCnt *ope
6870: 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nList = 0;../*.*
6880: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
6890: 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68 65  remembers whethe
68a0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
68b0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
68c0: 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63  ch others.** loc
68d0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ks..**.**    0: 
68e0: 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61   No.  Threads ca
68f0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
6900: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6910: 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29    (LinuxThreads)
6920: 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20  .**    1:  Yes. 
6930: 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   Threads can ove
6940: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6950: 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78  s locks.  (Posix
6960: 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31   & NLPT).**   -1
6970: 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77  :  We don't know
6980: 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73   yet..**.** On s
6990: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20  ome systems, we 
69a0: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
69b0: 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20  time if threads 
69c0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
69d0: 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b  h.** others lock
69e0: 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73  s.  On those sys
69f0: 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45  tems, the SQLITE
6a00: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
6a10: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77  _LOCK macro.** w
6a20: 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f  ill be set appro
6a30: 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74  priately.  On ot
6a40: 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20  her systems, we 
6a50: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74  have to check at
6a60: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e  .** runtime.  On
6a70: 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79   these latter sy
6a80: 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48  stems, SQLTIE_TH
6a90: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
6aa0: 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e  CK is.** undefin
6ab0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
6ac0: 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79  ariable normally
6ad0: 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20   has file scope 
6ae0: 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e  only.  But durin
6af0: 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61  g testing, we ma
6b00: 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61  ke.** it a globa
6b10: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65  l so that the te
6b20: 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e  st code can chan
6b30: 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20  ge its value in 
6b40: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a  order to verify.
6b50: 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ** that the righ
6b60: 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20  t stuff happens 
6b70: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
6b80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
6b90: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
6ba0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
6bb0: 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f    ifndef SQLITE_
6bc0: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6bd0: 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e 65  LOCK.#    define
6be0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6bf0: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
6c00: 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65  #  endif.#  ifde
6c10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
6c20: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
6c30: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
6c40: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
6c50: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
6c60: 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 69  #  else.static i
6c70: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
6c80: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6c90: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
6ca0: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
6cb0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
6cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
6cd0: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
6ce0: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
6cf0: 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  into individual 
6d00: 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  test.** threads 
6d10: 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61  by the testThrea
6d20: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
6d30: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
6d40: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
6d50: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b  Data {.  int fd;
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f  /* File to be lo
6d80: 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  cked */.  struct
6d90: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
6da0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
6db0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
6dc0: 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20  nt result;      
6dd0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
6de0: 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  of the locking o
6df0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  peration */.};..
6e00: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
6e10: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
6e20: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a  (__linux__)./*.*
6e30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6e40: 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 6d  is used as the m
6e50: 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
6e60: 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68 65  a thread launche
6e70: 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72 65  d by.** testThre
6e80: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6e90: 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77 68  r(). It tests wh
6ea0: 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65 64  ether the shared
6eb0: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a  -lock obtained.*
6ec0: 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74 68  * by the main th
6ed0: 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72 65  read in testThre
6ee0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
6ef0: 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  r() conflicts wi
6f00: 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74  th a.** hypothet
6f10: 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ical write-lock 
6f20: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
6f30: 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20 73   thread on the s
6f40: 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ame file..**.** 
6f50: 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  The write-lock i
6f60: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
6f70: 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69 73  cquired, as this
6f80: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
6f90: 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65   if .** the file
6fa0: 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61 64   is open in read
6fb0: 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65 20  -only mode (see 
6fc0: 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a  ticket #3472)..*
6fd0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  / .static void *
6fe0: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
6ff0: 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  t(void *pArg){. 
7000: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
7010: 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  stData *pData = 
7020: 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  (struct threadTe
7030: 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  stData*)pArg;.  
7040: 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20  pData->result = 
7050: 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c  fcntl(pData->fd,
7060: 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74 61   F_GETLK, &pData
7070: 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72  ->lock);.  retur
7080: 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  n pArg;.}.#endif
7090: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41   /* SQLITE_THREA
70a0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
70b0: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a  (__linux__) */..
70c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
70d0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
70e0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
70f0: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
7100: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
7110: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
7120: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
7130: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
7140: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
7150: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
7160: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
7170: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7180: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
7190: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
71a0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
71b0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
71c0: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
71d0: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74  .  int fd;.  int
71e0: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68   rc;.  struct th
71f0: 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a  readTestData d;.
7200: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
7210: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b  ;.  pthread_t t;
7220: 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f  ..  fd = dup(fd_
7230: 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c  orig);.  if( fd<
7240: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
7250: 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65  mset(&l, 0, size
7260: 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79  of(l));.  l.l_ty
7270: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
7280: 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  l.l_len = 1;.  l
7290: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
72a0: 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  l.l_whence = SEE
72b0: 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63  K_SET;.  rc = fc
72c0: 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53  ntl(fd_orig, F_S
72d0: 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28  ETLK, &l);.  if(
72e0: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b   rc!=0 ) return;
72f0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c  .  memset(&d, 0,
7300: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
7310: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f  .fd = fd;.  d.lo
7320: 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b  ck = l;.  d.lock
7330: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
7340: 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  K;.  pthread_cre
7350: 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61  ate(&t, 0, threa
7360: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
7370: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69  );.  pthread_joi
7380: 6e 28 74 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65  n(t, 0);.  close
7390: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
73a0: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
73b0: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
73c0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
73d0: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
73e0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
73f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7400: 45 5f 54 48 45 52 41 44 53 41 46 45 20 26 26 20  E_THERADSAFE && 
7410: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7420: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7430: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7440: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
7450: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
7460: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
7470: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
7480: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
7490: 49 6e 66 6f 28 73 74 72 75 63 74 20 75 6e 69 78  Info(struct unix
74a0: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29  LockInfo *pLock)
74b0: 7b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b  {.  if( pLock ){
74c0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66  .    pLock->nRef
74d0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  --;.    if( pLoc
74e0: 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  k->nRef==0 ){.  
74f0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
7500: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
7510: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70  assert( pLock->p
7520: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f  Prev->pNext==pLo
7530: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ck );.        pL
7540: 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ock->pPrev->pNex
7550: 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  t = pLock->pNext
7560: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7570: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
7580: 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29  ockList==pLock )
7590: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69  ;.        lockLi
75a0: 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  st = pLock->pNex
75b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
75c0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78   if( pLock->pNex
75d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
75e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ert( pLock->pNex
75f0: 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20  t->pPrev==pLock 
7600: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  );.        pLock
7610: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
7620: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20   pLock->pPrev;. 
7630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7640: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29  ite3_free(pLock)
7650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7660: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
7670: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
7680: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
7690: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
76a0: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
76b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
76c0: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
76d0: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
76e0: 4f 70 65 6e 29 7b 0a 20 20 69 66 28 20 70 4f 70  Open){.  if( pOp
76f0: 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d  en ){.    pOpen-
7700: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7710: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
7720: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
7730: 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  en->pPrev ){.   
7740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
7750: 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  en->pPrev->pNext
7760: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
7770: 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d     pOpen->pPrev-
7780: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
7790: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
77a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
77b0: 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f  rt( openList==pO
77c0: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  pen );.        o
77d0: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d  penList = pOpen-
77e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
77f0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
7800: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
7810: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
7820: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
7830: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7840: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50  pOpen->pNext->pP
7850: 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72  rev = pOpen->pPr
7860: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
7870: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7880: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
7890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
78a0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
78b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
78c0: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
78d0: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 75  riptor, locate u
78e0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  nixLockInfo and 
78f0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7900: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
7910: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
7920: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7930: 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20  Create new ones 
7940: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
7950: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
7960: 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69  ues might be uni
7970: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
7980: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
7990: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
79a0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
79b0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
79c0: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
79d0: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
79e0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
79f0: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
7a00: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
7a10: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
7a20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
7a30: 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  LockInfo **ppLoc
7a40: 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  k,  /* Return th
7a50: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
7a60: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
7a70: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
7a80: 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20  enCnt **ppOpen  
7a90: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7aa0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
7ab0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b  cture here */.){
7ac0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
7af0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
7b00: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
7b30: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
7b40: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
7b50: 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65  ixLockKey lockKe
7b60: 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20  y;    /* Lookup 
7b70: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
7b80: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
7b90: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  re */.  struct u
7ba0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
7bb0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
7bc0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
7bd0: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20  xOpenCnt struct 
7be0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
7bf0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
7c00: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
7c10: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
7c20: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  n */.  struct un
7c30: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
7c40: 6b 3b 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  k;    /* Candida
7c50: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
7c60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75  object */.  stru
7c70: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7c80: 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61  pOpen;     /* Ca
7c90: 6e 64 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e  ndidate unixOpen
7ca0: 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  Cnt object */.. 
7cb0: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
7cc0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
7cd0: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
7ce0: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
7cf0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
7d00: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
7d10: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
7d20: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
7d30: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
7d40: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
7d50: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
7d60: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7d70: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
7d80: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
7d90: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7da0: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
7db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
7dc0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
7dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7de0: 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  RR;.  }..  /* On
7df0: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
7e00: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
7e10: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
7e20: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
7e30: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
7e40: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
7e50: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
7e60: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
7e70: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
7e80: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
7e90: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
7ea0: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
7eb0: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
7ec0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
7ed0: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
7ee0: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
7ef0: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
7f00: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
7f10: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
7f20: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
7f30: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
7f40: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
7f50: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
7f60: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
7f70: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
7f80: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
7f90: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
7fa0: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
7fb0: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
7fc0: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
7fd0: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
7fe0: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
7ff0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
8000: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
8010: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
8020: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
8030: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
8040: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
8050: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
8060: 0a 20 20 20 20 77 72 69 74 65 28 66 64 2c 20 22  .    write(fd, "
8070: 53 22 2c 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  S", 1);.    rc =
8080: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
8090: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
80a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
80b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
80c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
80d0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
80e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
80f0: 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20  emset(&lockKey, 
8100: 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  0, sizeof(lockKe
8110: 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  y));.  lockKey.f
8120: 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  id.dev = statbuf
8130: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
8140: 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65  VXWORKS.  lockKe
8150: 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c  y.fid.pId = pFil
8160: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
8170: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20  lockKey.fid.ino 
8180: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
8190: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
81a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
81b0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
81c0: 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61  x__).  if( threa
81d0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
81e0: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
81f0: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
8200: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
8210: 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ;.  }.  lockKey.
8220: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
8230: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
8240: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
8250: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
8260: 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63  f.  fileId = loc
8270: 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20  kKey.fid;.  if( 
8280: 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20  ppLock!=0 ){.   
8290: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
82a0: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c  t;.    while( pL
82b0: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c  ock && memcmp(&l
82c0: 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e  ockKey, &pLock->
82d0: 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28  lockKey, sizeof(
82e0: 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20  lockKey)) ){.   
82f0: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b     pLock = pLock
8300: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
8310: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8320: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
8330: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8340: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
8350: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
8360: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
8370: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8380: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8390: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
83a0: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
83b0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79    pLock->lockKey
83c0: 20 3d 20 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20 20   = lockKey;.    
83d0: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20    pLock->nRef = 
83e0: 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  1;.      pLock->
83f0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
8400: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8410: 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   0;.      pLock-
8420: 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73  >pNext = lockLis
8430: 74 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  t;.      pLock->
8440: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
8450: 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20   if( lockList ) 
8460: 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20  lockList->pPrev 
8470: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c  = pLock;.      l
8480: 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b  ockList = pLock;
8490: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
84a0: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b    pLock->nRef++;
84b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f  .    }.    *ppLo
84c0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
84d0: 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20    if( ppOpen!=0 
84e0: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f  ){.    pOpen = o
84f0: 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  penList;.    whi
8500: 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d  le( pOpen && mem
8510: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f  cmp(&fileId, &pO
8520: 70 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  pen->fileId, siz
8530: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
8540: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f        pOpen = pO
8550: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
8560: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  }.    if( pOpen=
8570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65  =0 ){.      pOpe
8580: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  n = sqlite3_mall
8590: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65  oc( sizeof(*pOpe
85a0: 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n) );.      if( 
85b0: 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pOpen==0 ){.    
85c0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
85d0: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
85e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
85f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
8600: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
8610: 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  kinfo;.      }. 
8620: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65       pOpen->file
8630: 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20  Id = fileId;.   
8640: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d     pOpen->nRef =
8650: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   1;.      pOpen-
8660: 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  >nLock = 0;.    
8670: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
8680: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
8690: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
86a0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70  ;.      pOpen->p
86b0: 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b  Next = openList;
86c0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50  .      pOpen->pP
86d0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rev = 0;.      i
86e0: 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f 70  f( openList ) op
86f0: 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  enList->pPrev = 
8700: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70 65  pOpen;.      ope
8710: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a 23  nList = pOpen;.#
8720: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8730: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 53 65 6d 20      pOpen->pSem 
8740: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4f  = NULL;.      pO
8750: 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  pen->aSemName[0]
8760: 20 3d 20 27 5c 30 27 3b 0a 23 65 6e 64 69 66 0a   = '\0';.#endif.
8770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8780: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a   pOpen->nRef++;.
8790: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65      }.    *ppOpe
87a0: 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a  n = pOpen;.  }..
87b0: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
87c0: 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  o:.  return rc;.
87d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
87e0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
87f0: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
8800: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
8810: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
8820: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
8830: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
8840: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
8850: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
8860: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
8870: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
8880: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
8890: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
88a0: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
88b0: 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75  n systems that u
88c0: 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  se LinuxThreads.
88d0: 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70  .**.** Ownership
88e0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c   transfer is onl
88f0: 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  y allowed if the
8900: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72   unixFile is cur
8910: 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  rently unlocked.
8920: 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46  .** If the unixF
8930: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e  ile is locked an
8940: 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69  d an ownership i
8950: 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65  s wrong, then re
8960: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  turn.** SQLITE_M
8970: 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f  ISUSE.  SQLITE_O
8980: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
8990: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
89a0: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
89b0: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
89c0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
89d0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  ).static int tra
89e0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75  nsferOwnership(u
89f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
8a00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
8a10: 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20  read_t hSelf;.  
8a20: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
8a30: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
8a40: 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e  ks ){.    /* Own
8a50: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73  ership transfers
8a60: 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74   not needed on t
8a70: 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  his system */.  
8a80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a90: 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20  OK;.  }.  hSelf 
8aa0: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
8ab0: 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f  ;.  if( pthread_
8ac0: 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64  equal(pFile->tid
8ad0: 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20  , hSelf) ){.    
8ae0: 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20  /* We are still 
8af0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  in the same thre
8b00: 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ad */.    OSTRAC
8b10: 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c  E1("No-transfer,
8b20: 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29   same thread\n")
8b30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8b40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
8b50: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
8b60: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
8b70: 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63    /* We cannot c
8b80: 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20  hange ownership 
8b90: 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c  while we are hol
8ba0: 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a  ding a lock! */.
8bb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8bc0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
8bd0: 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66  OSTRACE4("Transf
8be0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
8bf0: 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  %d from %d to %d
8c00: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
8c10: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
8c20: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20  ->tid, hSelf);. 
8c30: 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53   pFile->tid = hS
8c40: 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65  elf;.  if (pFile
8c50: 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29  ->pLock != NULL)
8c60: 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   {.    releaseLo
8c70: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
8c80: 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ock);.    rc = f
8c90: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  indLockInfo(pFil
8ca0: 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  e, &pFile->pLock
8cb0: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
8cc0: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
8cd0: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
8ce0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
8cf0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
8d00: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
8d10: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
8d20: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
8d30: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
8d40: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
8d50: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
8d60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
8d70: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8d80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8d90: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20  .}.#else  /* if 
8da0: 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41  not SQLITE_THREA
8db0: 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e  DSAFE */.  /* On
8dc0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
8dd0: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
8de0: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
8df0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
8e00: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
8e10: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
8e20: 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  K.#endif /* SQLI
8e30: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f  TE_THREADSAFE */
8e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
8e50: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
8e60: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
8e70: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
8e80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
8e90: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
8ea0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
8eb0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
8ec0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
8ed0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
8ee0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
8ef0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
8f00: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
8f10: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
8f20: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
8f30: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
8f40: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
8f50: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
8f60: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
8f70: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8f80: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
8f90: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
8fa0: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
8fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8fc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
8fd0: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
8fe0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
8ff0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
9000: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
9010: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
9020: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
9030: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
9040: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9050: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
9060: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
9070: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
9080: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
9090: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
90a0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
90b0: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
90c0: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
90d0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
90e0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
90f0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
9100: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
9110: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
9120: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
9130: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9140: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
9150: 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
9160: 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  d ){.    struct 
9170: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
9180: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9190: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
91a0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
91b0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
91c0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
91d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
91e0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
91f0: 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70  f (-1 == fcntl(p
9200: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
9210: 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20  , &lock)) {.    
9220: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
9230: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9240: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
9250: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
9260: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
9270: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
9280: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
9290: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
92a0: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
92b0: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
92c0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
92d0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
92e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
92f0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
9300: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
9310: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
9320: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
9330: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
9340: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
9350: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
9360: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
9370: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
9380: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
9390: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
93a0: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
93b0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
93c0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
93d0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
93e0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
93f0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
9400: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
9410: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
9420: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
9430: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
9440: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
9450: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
9460: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
9470: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
9480: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
9490: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
94a0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
94b0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
94c0: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
94d0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
94e0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
94f0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
9500: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
9510: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
9520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
9530: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
9540: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
9550: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
9560: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
9570: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
9580: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
9590: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
95a0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
95b0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
95c0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
95d0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
95e0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
95f0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
9600: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
9610: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
9620: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9630: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
9640: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
9650: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
9660: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
9670: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
9680: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
9690: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
96a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
96b0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
96c0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
96d0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
96e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
96f0: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
9700: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
9710: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
9720: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
9730: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
9740: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
9750: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
9760: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
9770: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
9780: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
9790: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
97a0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
97b0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
97c0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
97d0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
97e0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
97f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
9800: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
9810: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
9820: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
9830: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
9840: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
9850: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
9860: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
9870: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
9880: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
9890: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
98a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
98b0: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
98c0: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
98d0: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
98e0: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
98f0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
9900: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9910: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
9920: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
9930: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
9940: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
9950: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
9960: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
9970: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
9980: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
9990: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
99a0: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
99b0: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
99c0: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
99d0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
99e0: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
99f0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
9a00: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
9a10: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
9a20: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
9a30: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
9a40: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
9a50: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
9a60: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
9a70: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
9a80: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
9a90: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
9aa0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
9ab0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
9ac0: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
9ad0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
9ae0: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
9af0: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
9b00: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
9b10: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
9b20: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
9b30: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
9b40: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
9b50: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
9b60: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
9b70: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
9b80: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
9b90: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
9ba0: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
9bb0: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
9bc0: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
9bd0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
9be0: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
9bf0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
9c00: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
9c10: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
9c20: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
9c30: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
9c40: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
9c50: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
9c60: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
9c70: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
9c80: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
9c90: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
9ca0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
9cb0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
9cc0: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
9cd0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9ce0: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
9cf0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
9d00: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
9d10: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
9d20: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
9d30: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
9d40: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
9d50: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
9d60: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
9d70: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
9d80: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
9d90: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
9da0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
9db0: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
9dc0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
9dd0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
9de0: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
9df0: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
9e00: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9e10: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9e20: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
9e30: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
9e40: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
9e50: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
9e60: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
9e70: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
9e80: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
9e90: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
9ea0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
9eb0: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
9ec0: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
9ed0: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
9ee0: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
9ef0: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
9f00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9f10: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
9f20: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
9f30: 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75  *)id;.  struct u
9f40: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
9f50: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
9f60: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
9f70: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
9f80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
9f90: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
9fa0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
9fb0: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
9fc0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
9fd0: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
9fe0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
9ff0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
a000: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
a010: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
a020: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
a030: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
a040: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
a050: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
a060: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
a070: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
a080: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
a090: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
a0a0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
a0b0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
a0c0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
a0d0: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
a0e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
a0f0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
a100: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
a110: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
a120: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
a130: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
a140: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
a150: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
a160: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
a170: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
a180: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
a190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a1a0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
a1b0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
a1c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
a1d0: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
a1e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
a1f0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
a200: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
a210: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
a220: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
a230: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
a240: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
a250: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
a260: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
a270: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a280: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
a290: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
a2a0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
a2b0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
a2c0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
a2d0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
a2e0: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
a2f0: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
a300: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
a310: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
a320: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
a330: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
a340: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a350: 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
a360: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
a370: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a380: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
a390: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
a3a0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
a3b0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
a3c0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
a3d0: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
a3e0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
a3f0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
a400: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
a410: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
a420: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c  .  if( (pFile->l
a430: 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e  ocktype!=pLock->
a440: 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20  locktype && .   
a450: 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c         (pLock->l
a460: 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  ocktype>=PENDING
a470: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
a480: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  e>SHARED_LOCK)).
a490: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a4a0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
a4b0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a4c0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
a4d0: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
a4e0: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
a4f0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
a500: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
a510: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
a520: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
a530: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
a540: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
a550: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
a560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
a570: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
a580: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
a590: 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e   .      (pLock->
a5a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a5b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
a5c0: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
a5d0: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
a5e0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a5f0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
a600: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
a610: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  le->locktype==0 
a620: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a630: 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20  Lock->cnt>0 );. 
a640: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a650: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a660: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ;.    pLock->cnt
a670: 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  ++;.    pFile->p
a680: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a690: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a6a0: 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  ;.  }..  lock.l_
a6b0: 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63  len = 1L;..  loc
a6c0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a6d0: 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50  K_SET;..  /* A P
a6e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
a6f0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
a700: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
a710: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
a720: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
a730: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
a740: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
a750: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
a760: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
a770: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
a780: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
a790: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
a7a0: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
a7b0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a7c0: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
a7d0: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
a7e0: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
a7f0: 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70  _type = (locktyp
a800: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  e==SHARED_LOCK?F
a810: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
a820: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a830: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
a840: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
a850: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
a860: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
a870: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
a880: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
a890: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
a8a0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a8b0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a8c0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a8d0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
a8e0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
a8f0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
a900: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a910: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
a920: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
a930: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
a940: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
a950: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
a960: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
a970: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
a980: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
a990: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
a9a0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
a9b0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
a9c0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
a9d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
a9e0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
a9f0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
aa00: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
aa10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
aa20: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
aa30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
aa40: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
aa50: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
aa60: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
aa70: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
aa80: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
aa90: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
aaa0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
aab0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
aac0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
aad0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
aae0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
aaf0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
ab00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
ab10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
ab20: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
ab30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
ab40: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
ab50: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ab60: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
ab70: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
ab80: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
ab90: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
aba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
abb0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
abc0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
abd0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
abe0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
abf0: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
ac00: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
ac10: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ac20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ac30: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
ac40: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ac50: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ac60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ac70: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ac80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac90: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
aca0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
acb0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
acc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
acd0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
ace0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
acf0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
ad00: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
ad10: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ad20: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ad30: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ad40: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
ad50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
ad60: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
ad70: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
ad80: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
ad90: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
ada0: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
adb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
adc0: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
add0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
ade0: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
adf0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
ae00: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
ae10: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
ae20: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
ae30: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
ae40: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
ae50: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
ae60: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
ae70: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
ae80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
ae90: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
aea0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
aeb0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
aec0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
aed0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
aee0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
aef0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
af00: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
af10: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
af20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
af30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
af40: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
af50: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
af60: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
af70: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
af80: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
af90: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
afa0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
afb0: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
afc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
afd0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
afe0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
aff0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
b000: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
b010: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
b020: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
b030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
b040: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
b050: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
b060: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
b070: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b080: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
b090: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b0a0: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
b0b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
b0c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b0d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b0e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
b0f0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
b100: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b110: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
b120: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b130: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
b140: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
b150: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
b160: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
b170: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
b180: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
b190: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
b1a0: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
b1b0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
b1c0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
b1d0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
b1e0: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
b1f0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
b200: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
b210: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
b220: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
b230: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
b240: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
b250: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b260: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
b270: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ->locktype<=SHAR
b280: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 6c 6f  ED_LOCK.   && lo
b290: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
b2a0: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
b2b0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
b2c0: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
b2d0: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
b2e0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
b2f0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
b300: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
b310: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b320: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
b330: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b340: 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  pe;.    pLock->l
b350: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b360: 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pe;.  }else if( 
b370: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
b380: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
b390: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b3a0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
b3b0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
b3c0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
b3d0: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
b3e0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
b3f0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
b400: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
b410: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
b420: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
b430: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
b440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
b450: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
b460: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
b470: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
b480: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
b490: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
b4a0: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
b4b0: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
b4c0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
b4d0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
b4e0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
b4f0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
b500: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
b510: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
b520: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
b530: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
b540: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
b550: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
b560: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
b570: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
b580: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
b590: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
b5a0: 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20  type){.  struct 
b5b0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
b5c0: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
b5d0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
b5e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b5f0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b600: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b610: 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  d;.  int h;..  a
b620: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b630: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
b640: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
b650: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
b660: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
b670: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
b680: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
b690: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
b6a0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
b6b0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
b6c0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
b6d0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
b6e0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
b6f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
b700: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
b710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b720: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
b730: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
b740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b750: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
b760: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
b770: 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c  ex();.  h = pFil
b780: 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20  e->h;.  pLock = 
b790: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
b7a0: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
b7b0: 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
b7c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
b7d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
b7e0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b7f0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65  >locktype==pFile
b800: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
b810: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b820: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
b830: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
b840: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
b850: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b860: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
b870: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
b880: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
b890: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
b8a0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
b8b0: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
b8c0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
b8d0: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
b8e0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
b8f0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
b900: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
b910: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
b920: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
b930: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
b940: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
b950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
b960: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
b970: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
b980: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
b990: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
b9a0: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
b9b0: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
b9c0: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
b9d0: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
b9e0: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
b9f0: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
ba00: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
ba10: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
ba20: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
ba30: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
ba40: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
ba50: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
ba60: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
ba70: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
ba80: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
ba90: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
baa0: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
bab0: 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
bac0: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
bad0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20   0;.#endif...   
bae0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
baf0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
bb00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
bb10: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
bb20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bb30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
bb40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bb60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bb70: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
bb80: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
bb90: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bba0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bbb0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
bbc0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
bbd0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bbe0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
bbf0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
bc00: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
bc10: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bc20: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bc30: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bc40: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
bc50: 0a 20 20 20 20 20 20 20 20 7d 0a 09 09 09 09 67  .        }.....g
bc60: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bc80: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
bc90: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
bca0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
bcb0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
bcc0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
bcd0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
bce0: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
bcf0: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
bd00: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
bd10: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66  YTE );.    if( f
bd20: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
bd30: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
bd40: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
bd50: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
bd60: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
bd70: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
bd80: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
bd90: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
bda0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
bdb0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
bdc0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
bdd0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
bde0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
bdf0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
be00: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
be10: 20 20 20 20 20 20 7d 0a 09 09 09 67 6f 74 6f 20        }....goto 
be20: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
be30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  }.  }.  if( lock
be40: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
be50: 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78  .    struct unix
be60: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  OpenCnt *pOpen;.
be70: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
be80: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
be90: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
bea0: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
beb0: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
bec0: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
bed0: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
bee0: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
bef0: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
bf00: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
bf10: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
bf20: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
bf30: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
bf40: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
bf50: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
bf60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
bf70: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
bf80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bf90: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
bfa0: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
bfb0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
bfc0: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
bfd0: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
bfe0: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
bff0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
c000: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0);.      if( fc
c010: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
c020: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
c030: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
c040: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
c050: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
c060: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
c070: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c080: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
c090: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
c0a0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
c0b0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
c0c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
c0d0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
c0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
c0f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c100: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
c110: 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  .        pLock->
c120: 63 6e 74 20 3d 20 31 3b 0a 09 09 09 09 67 6f 74  cnt = 1;.....got
c130: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
c140: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c150: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
c160: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
c170: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
c180: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
c190: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
c1a0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
c1b0: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
c1c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
c1d0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
c1e0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
c1f0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
c200: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
c210: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c220: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c230: 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65     pOpen = pFile
c240: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70  ->pOpen;.      p
c250: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
c260: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
c270: 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
c280: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
c290: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
c2a0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
c2b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
c2c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c2d0: 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ; i<pOpen->nPend
c2e0: 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ing; i++){.     
c2f0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 20 70 65       /* close pe
c300: 6e 64 69 6e 67 20 66 64 73 2c 20 62 75 74 20 69  nding fds, but i
c310: 66 20 63 6c 6f 73 69 6e 67 20 66 61 69 6c 73 20  f closing fails 
c320: 64 6f 6e 27 74 20 66 72 65 65 20 74 68 65 20 61  don't free the a
c330: 72 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a  rray.          *
c340: 2a 20 61 73 73 69 67 6e 20 2d 31 20 74 6f 20 74  * assign -1 to t
c350: 68 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  he successfully 
c360: 63 6c 6f 73 65 64 20 64 65 73 63 72 69 70 74 6f  closed descripto
c370: 72 73 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  rs and record th
c380: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
c390: 72 72 6f 72 2e 20 20 54 68 65 20 6e 65 78 74 20  rror.  The next 
c3a0: 61 74 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f 63  attempt to unloc
c3b0: 6b 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  k will try again
c3c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
c3d0: 66 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  f( pOpen->aPendi
c3e0: 6e 67 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74  ng[i] < 0 ) cont
c3f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
c400: 69 66 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d  if( close(pOpen-
c410: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b  >aPending[i]) ){
c420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
c430: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c440: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
c450: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c460: 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
c470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c480: 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e           pOpen->
c490: 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31  aPending[i] = -1
c4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
c4e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
c4f0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20  n->aPending);.  
c500: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e          pOpen->n
c510: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
c520: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
c530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
c540: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c550: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
c560: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
c570: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
c580: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c590: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
c5a0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
c5b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c5c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c5d0: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
c5e0: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
c5f0: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
c600: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
c610: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
c620: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
c630: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
c640: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
c650: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
c660: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
c670: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
c680: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
c690: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
c6a0: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
c6b0: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
c6c0: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
c6d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c6e0: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
c6f0: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
c700: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
c710: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
c720: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
c730: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
c740: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
c750: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
c760: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
c770: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
c780: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c790: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
c7a0: 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66   pFile ){.    if
c7b0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
c7c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  0 ){.      int e
c7d0: 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
c7e0: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20  ->dirfd);.      
c7f0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
c800: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c810: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c820: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c830: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
c840: 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  SE;.      }else{
c850: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c860: 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20  dirfd=-1;.      
c870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c880: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
c890: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
c8a0: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  lose(pFile->h);.
c8b0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
c8c0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c8d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
c8e0: 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
c8f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
c900: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOSE;.      }.  
c910: 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52    }.#if OS_VXWOR
c920: 4b 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  KS.    if( pFile
c930: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69  ->pId ){.      i
c940: 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65  f( pFile->isDele
c950: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  te ){.        un
c960: 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
c970: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
c980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c990: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
c9a0: 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
c9b0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
c9c0: 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  Id = 0;.    }.#e
c9d0: 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45  ndif.    OSTRACE
c9e0: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
c9f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
ca00: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d     OpenCounter(-
ca10: 31 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  1);.    memset(p
ca20: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
ca30: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a  unixFile));.  }.
ca40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ca50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
ca60: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
ca70: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
ca80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ca90: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
caa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
cab0: 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
cac0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
cad0: 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
cae0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
caf0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
cb00: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
cb10: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
cb20: 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e  pOpen && pFile->
cb30: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  pOpen->nLock ){.
cb40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
cb50: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
cb60: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
cb70: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
cb80: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
cb90: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
cba0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
cbb0: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
cbc0: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
cbd0: 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
cbe0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
cbf0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
cc00: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
cc10: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
cc20: 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
cc30: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
cc40: 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
cc50: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
cc60: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75  ;.      struct u
cc70: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
cc80: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
cc90: 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73  ;.      aNew = s
cca0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
ccb0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20  Open->aPending, 
ccc0: 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  (pOpen->nPending
ccd0: 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  +1)*sizeof(int) 
cce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
ccf0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
cd00: 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66  /* If a malloc f
cd10: 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20  ails, just leak 
cd20: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
cd30: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  tor */.      }el
cd40: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  se{.        pOpe
cd50: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e  n->aPending = aN
cd60: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  ew;.        pOpe
cd70: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65  n->aPending[pOpe
cd80: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70  n->nPending] = p
cd90: 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20  File->h;.       
cda0: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
cdb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  ++;.        pFil
cdc0: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
cdd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c   }.    }.    rel
cde0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
cdf0: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
ce00: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
ce10: 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  File->pOpen);.  
ce20: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
ce30: 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
ce40: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
ce50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ce60: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
ce70: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
ce80: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
ce90: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
cea0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
ceb0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf00: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
cf10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf50: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
cf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf70: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
cf80: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfa0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
cfb0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
cfc0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
cfd0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
cfe0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
cff0: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
d000: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
d010: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
d020: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
d030: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
d040: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
d050: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
d060: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
d070: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
d080: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
d090: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
d0a0: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
d0b0: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
d0c0: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
d0d0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
d0e0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
d0f0: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
d100: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
d110: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
d120: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
d130: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
d140: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
d150: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
d160: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
d170: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
d180: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
d190: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
d1a0: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
d1b0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
d1c0: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
d1d0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
d1e0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
d1f0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
d200: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
d210: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
d220: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d230: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
d240: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
d250: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
d260: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
d270: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
d280: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
d290: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
d2a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d2b0: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
d2c0: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
d2d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
d2e0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
d2f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
d300: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
d310: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
d320: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d330: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
d340: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
d350: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
d360: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
d370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d380: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
d390: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
d3a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
d3b0: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
d3c0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
d3d0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
d3e0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
d3f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d400: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
d410: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
d420: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
d430: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
d440: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
d450: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
d460: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
d470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
d480: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
d490: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
d4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4b0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
d4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d500: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
d510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d550: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
d560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d570: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
d580: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
d590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5a0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
d5b0: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
d5c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
d5d0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  uses the existin
d5e0: 67 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  g of separate lo
d5f0: 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f  ck.** files in o
d600: 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  rder to control 
d610: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
d620: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f  tabase.  This wo
d630: 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61  rks on just.** a
d640: 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73  bout every files
d650: 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65  ystem imaginable
d660: 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65  .  But there are
d670: 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64   serious downsid
d680: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  es:.**.**    (1)
d690: 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20    There is zero 
d6a0: 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20  concurrency.  A 
d6b0: 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c  single reader bl
d6c0: 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a  ocks all other.*
d6d0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63  *         connec
d6e0: 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69  tions from readi
d6f0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
d700: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
d710: 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70  *    (2)  An app
d720: 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f  lication crash o
d730: 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e  r power loss can
d740: 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63   leave stale loc
d750: 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20  k files.**      
d760: 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e     sitting aroun
d770: 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  d that need to b
d780: 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c  e cleared manual
d790: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74  ly..**.** Nevert
d7a0: 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63  heless, a dotloc
d7b0: 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69  k is an appropri
d7c0: 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ate locking mode
d7d0: 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a   for use if no.*
d7e0: 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
d7f0: 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69  strategy is avai
d800: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74  lable..**.** Dot
d810: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  file locking wor
d820: 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ks by creating a
d830: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
d840: 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
d850: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
d860: 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
d870: 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
d880: 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
d890: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
d8a0: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20   existance of a 
d8b0: 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65  lock file implie
d8c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
d8d0: 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  ock.  All other 
d8e0: 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53  lock.** types (S
d8f0: 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
d900: 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
d910: 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
d920: 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
d930: 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
d940: 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
d950: 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
d960: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
d970: 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69  e the.** lock fi
d980: 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  le..*/.#define D
d990: 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
d9a0: 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
d9b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
d9c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
d9d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
d9e0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
d9f0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
da00: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
da10: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
da20: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
da30: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
da40: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
da50: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
da60: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
da70: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
da80: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
da90: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
daa0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
dab0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
dac0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
dad0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
dae0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
daf0: 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
db00: 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
db10: 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
db20: 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
db30: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
db40: 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
db50: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
db60: 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
db70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
db80: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
db90: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
dbb0: 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
dbc0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
dbd0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
dbe0: 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
dbf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
dc00: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
dc10: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
dc20: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
dc30: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
dc40: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
dc50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
dc60: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
dc70: 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
dc80: 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
dc90: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
dca0: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
dcb0: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
dcc0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
dcd0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
dce0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
dcf0: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
dd00: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
dd10: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
dd20: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
dd30: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
dd40: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
dd50: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
dd60: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
dd70: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
dd80: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
dd90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
dda0: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
ddb0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
ddc0: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
ddd0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dde0: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
ddf0: 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
de00: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
de10: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 61 63     reserved = ac
de20: 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  cess(zLockFile, 
de30: 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54  0)==0;.  }.  OST
de40: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
de50: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
de60: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
de70: 65 73 65 72 76 65 64 29 3b 0a 20 20 2a 70 52 65  eserved);.  *pRe
de80: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
de90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dea0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
deb0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
dec0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
ded0: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
dee0: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
def0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
df00: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
df10: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
df20: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
df30: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
df40: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
df50: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
df60: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
df70: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
df80: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
df90: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
dfa0: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
dfb0: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
dfc0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
dfd0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
dfe0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
dff0: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
e000: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
e010: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
e020: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
e030: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
e040: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
e050: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
e060: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
e070: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
e080: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
e090: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
e0a0: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
e0b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
e0c0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
e0d0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
e0e0: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
e0f0: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
e100: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
e110: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
e120: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e130: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
e140: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
e150: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
e160: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
e170: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
e180: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
e190: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
e1a0: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
e1b0: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
e1c0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
e1d0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
e1e0: 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
e1f0: 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
e200: 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
e210: 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
e220: 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
e230: 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
e240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
e250: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
e260: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
e270: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
e280: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e290: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e2a0: 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a  int fd;.  char *
e2b0: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
e2c0: 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
e2d0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
e2e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e2f0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
e300: 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
e310: 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
e320: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
e330: 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
e340: 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
e350: 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
e360: 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
e370: 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
e380: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
e390: 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ype > NO_LOCK ){
e3a0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
e3b0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
e3c0: 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
e3d0: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
e3e0: 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
e3f0: 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
e400: 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65  ile */.    utime
e410: 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
e420: 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
e430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e440: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
e450: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
e460: 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  ock */.  fd = op
e470: 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52  en(zLockFile,O_R
e480: 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
e490: 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
e4a0: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( fd<0 ){.    /*
e4b0: 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
e4c0: 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
e4d0: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61   someone else ma
e4e0: 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68  y have stolen th
e4f0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
e500: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e510: 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
e520: 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
e530: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e540: 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
e550: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
e560: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e570: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e590: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
e5a0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
e5b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
e5c0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e5d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
e5e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
e5f0: 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 63 6c  c;.  } .  if( cl
e600: 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70  ose(fd) ){.    p
e610: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e620: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
e630: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
e640: 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  LOSE;.  }.  .  /
e650: 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
e660: 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
e670: 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
e680: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
e690: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
e6a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
e6b0: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
e6c0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
e6d0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
e6e0: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
e6f0: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
e700: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e710: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e720: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e730: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e740: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e750: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e760: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e770: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e780: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e790: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e7a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c  **.** When the l
e7b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61  ocking level rea
e7c0: 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65  ches NO_LOCK, de
e7d0: 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
e7e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e7f0: 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  t dotlockUnlock(
e800: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e810: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
e820: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
e830: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e840: 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
e850: 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
e860: 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
e870: 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
e880: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e890: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
e8a0: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
e8b0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
e8c0: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20  , locktype,..   
e8d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
e8e0: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73   getpid());.  as
e8f0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
e900: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e910: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
e920: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
e930: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
e940: 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
e950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e960: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
e970: 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
e980: 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
e990: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
e9a0: 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
e9b0: 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
e9c0: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
e9d0: 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
e9e0: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
e9f0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
ea00: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ea10: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ea20: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
ea30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ea40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
ea50: 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
ea60: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
ea70: 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
ea80: 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
ea90: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
eaa0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  OCK );.  if( unl
eab0: 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29  ink(zLockFile) )
eac0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
ead0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
eae0: 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
eaf0: 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
eb00: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
eb10: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
eb20: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
eb30: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
eb40: 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
eb50: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
eb60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
eb70: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
eb80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
eb90: 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
eba0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
ebb0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
ebc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ebd0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
ebe0: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
ebf0: 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
ec00: 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
ec10: 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
ec20: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
ec30: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
ec40: 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
ec50: 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
ec60: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ec70: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
ec80: 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  d;.    dotlockUn
ec90: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
eca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ecb0: 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
ecc0: 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
ecd0: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
ece0: 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75  File(id);.  retu
ecf0: 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
ed00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
ed10: 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
ed20: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
ed30: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
ed40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ed50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed90: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
eda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ede0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
edf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee00: 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
ee10: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
ee20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
ee40: 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
ee50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
ee60: 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
ee70: 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
ee80: 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
ee90: 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
eea0: 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
eeb0: 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
eec0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
eed0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
eee0: 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
eef0: 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
ef00: 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
ef10: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
ef20: 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
ef30: 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
ef40: 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
ef50: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
ef60: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
ef70: 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
ef80: 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
ef90: 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
efa0: 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
efb0: 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
efc0: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
efd0: 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
efe0: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
eff0: 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
f000: 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
f010: 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
f020: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f030: 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
f040: 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70  ff or if.** comp
f050: 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b  iling for VXWORK
f060: 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  S..*/.#if SQLITE
f070: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f080: 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
f090: 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
f0a0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
f0b0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
f0c0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
f0d0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
f0e0: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
f0f0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
f100: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
f110: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
f120: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
f130: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
f140: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
f150: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
f160: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
f170: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
f180: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
f190: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
f1a0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
f1b0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
f1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
f1d0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
f1e0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f1f0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f200: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
f210: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f220: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
f230: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f240: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f250: 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
f260: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
f270: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
f280: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
f290: 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
f2a0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
f2b0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
f2c0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
f2d0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
f2e0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
f2f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
f300: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
f310: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
f320: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
f330: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
f340: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
f350: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
f360: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
f370: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
f380: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
f390: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
f3a0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f3b0: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
f3c0: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
f3d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
f3e0: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
f3f0: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
f400: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f410: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f420: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
f430: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
f440: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f450: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
f460: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
f470: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
f480: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f490: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f4a0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f4b0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
f4c0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f4d0: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
f4e0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f4f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f500: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f510: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
f520: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f530: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
f540: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
f550: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
f560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
f570: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
f580: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
f590: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
f5a0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f5b0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f5c0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f5d0: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
f5e0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f5f0: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
f600: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f610: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f620: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
f630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f640: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
f650: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
f660: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
f670: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
f680: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
f690: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f6a0: 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
f6b0: 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
f6c0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
f6d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f6e0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
f6f0: 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
f700: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
f710: 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
f720: 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
f730: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
f740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f750: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
f760: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
f770: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
f780: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
f790: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
f7a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
f7b0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
f7c0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
f7d0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
f7e0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
f7f0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
f800: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
f810: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
f820: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
f830: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
f840: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
f850: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
f860: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
f870: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
f880: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
f890: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
f8a0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
f8b0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
f8c0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
f8d0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
f8e0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
f8f0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
f900: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
f910: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
f920: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
f930: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
f940: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
f950: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
f960: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
f970: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
f980: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
f990: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
f9a0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
f9b0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f9c0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
f9d0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
f9e0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
f9f0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
fa00: 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
fa10: 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
fa20: 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
fa30: 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
fa40: 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
fa50: 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
fa60: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
fa70: 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
fa80: 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
fa90: 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
faa0: 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
fab0: 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
fac0: 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
fad0: 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
fae0: 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
faf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fb00: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
fb10: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
fb20: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
fb30: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
fb40: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
fb50: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
fb60: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
fb70: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
fb80: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fb90: 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ype) {.  int rc 
fba0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
fbb0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
fbc0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
fbd0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
fbe0: 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
fbf0: 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
fc00: 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
fc10: 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
fc20: 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
fc30: 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
fc40: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
fc50: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
fc60: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
fc70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fc80: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
fc90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fca0: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
fcb0: 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
fcc0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
fcd0: 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68   (flock(pFile->h
fce0: 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
fcf0: 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
fd00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
fd10: 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
fd20: 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
fd30: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
fd40: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
fd50: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
fd60: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
fd70: 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
fd80: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
fd90: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fda0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fdb0: 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
fdc0: 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
fdd0: 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
fde0: 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
fdf0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fe00: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
fe10: 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  }.  OSTRACE4("LO
fe20: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
fe30: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
fe40: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
fe50: 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pe), .          
fe60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
fe70: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
fe80: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
fe90: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
fea0: 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
feb0: 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
fec0: 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
fed0: 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
fee0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
fef0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ff00: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
ff10: 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
ff20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
ff30: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
ff40: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
ff50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
ff60: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
ff70: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
ff80: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
ff90: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
ffa0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
ffb0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
ffc0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
ffd0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
ffe0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fff0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
10000 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
10010 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10020 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10030 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
10040 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10050 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
10060 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
10070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10080 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
10090 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
100a0 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
100b0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
100c0 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
100d0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
100e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
100f0 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
10100 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
10110 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
10120 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
10130 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
10140 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
10150 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
10160 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
10170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10180 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10190 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
101a0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
101b0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
101c0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
101d0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
101e0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
101f0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
10200 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
10210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10220 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
10230 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
10240 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
10250 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
10260 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
10270 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
10280 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10290 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
102a0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
102b0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
102c0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
102d0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
102e0 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
102f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10300 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
10310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
10320 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
10330 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
10340 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
10350 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
10360 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
10370 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
10380 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10390 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
103a0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
103b0 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
103c0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
103d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
103e0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
103f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10400 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
10410 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
10420 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
10430 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10440 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
10450 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  d ){.    flockUn
10460 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10470 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10480 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
10490 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
104a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
104b0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
104c0 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
104f0 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
10500 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105d0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
105e0 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
105f0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
10600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10610 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
10620 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
10630 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
10640 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
10650 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
10660 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
10670 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
10680 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
10690 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
106a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
106b0 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
106c0 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
106d0 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
106e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
106f0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
10700 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
10710 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
10720 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
10730 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
10740 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
10750 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
10760 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
10770 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10780 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10790 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
107a0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
107b0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
107c0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
107d0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
107e0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
107f0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
10800 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
10810 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
10820 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
10830 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
10840 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
10850 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
10860 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
10870 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
10880 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
10890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108a0 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
108b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
108c0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
108d0 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
108e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
108f0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
10900 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10910 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10920 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
10930 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
10940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
10950 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
10960 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
10970 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
10980 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
10990 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
109a0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
109b0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
109c0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
109d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
109e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
109f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
10a00 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
10a10 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
10a20 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
10a30 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
10a40 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
10a50 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  ile->pOpen->pSem
10a60 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
10a70 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20  t statBuf;..    
10a80 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
10a90 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
10aa0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10ab0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
10ac0 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
10ad0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
10ae0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10af0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10b00 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10b10 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
10b20 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69  CK);.        pFi
10b30 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10b40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20  tErrno;.      } 
10b50 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
10b60 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
10b70 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
10b80 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
10b90 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
10ba0 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
10bb0 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52  >locktype < SHAR
10bc0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
10bd0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10be0 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
10bf0 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
10c00 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
10c10 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
10c20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
10c30 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
10c40 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
10c50 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
10c60 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  rved);..  *pResO
10c70 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
10c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10c90 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
10ca0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
10cb0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
10cc0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
10cd0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10ce0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10cf0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10d00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10d10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10d20 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10d30 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10d40 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
10d50 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
10d60 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
10d70 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
10d80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10d90 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
10da0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10db0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10dc0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10dd0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10de0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10df0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10e00 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10e10 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10e20 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10e30 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10e40 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
10e50 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
10e60 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
10e70 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
10e80 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
10e90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
10ea0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10eb0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10ec0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10ed0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10ee0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10ef0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10f00 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10f10 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10f20 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10f30 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10f40 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
10f50 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
10f60 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
10f70 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
10f80 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
10f90 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
10fa0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
10fb0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
10fc0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
10fd0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
10fe0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
10ff0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
11000 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
11010 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
11020 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
11030 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
11040 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
11050 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
11060 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
11070 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
11080 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
11090 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
110a0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
110b0 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
110c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
110d0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
110e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
110f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11100 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
11110 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
11120 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69  pOpen->pSem;.  i
11130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11140 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
11150 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11160 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11170 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11180 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11190 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
111a0 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
111b0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e  File->locktype >
111c0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
111d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
111e0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
111f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11200 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
11210 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
11220 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
11230 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
11240 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
11250 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
11260 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
11270 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
11280 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
11290 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
112a0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
112b0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
112c0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
112d0 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
112e0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
112f0 79 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ype;.. sem_end_l
11300 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
11310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11320 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11330 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
11340 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
11350 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
11360 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
11370 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
11380 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
11390 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
113a0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
113b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
113c0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
113d0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
113e0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
113f0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
11400 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
11410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
11420 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11430 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
11440 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
11450 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11460 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
11470 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
11480 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a  e->pOpen->pSem;.
11490 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
114a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
114b0 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  em );.  OSTRACE5
114c0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
114d0 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22  was %d pid=%d\n"
114e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
114f0 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d  type,..   pFile-
11500 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
11510 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
11520 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
11530 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11540 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11550 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11560 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
11570 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
11580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11590 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
115a0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
115b0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
115c0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
115d0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c  usive */.  if (l
115e0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
115f0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
11600 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
11610 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
11620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11630 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
11640 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
11650 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
11660 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
11670 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
11680 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
11690 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
116a0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
116b0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
116c0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
116d0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
116e0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
116f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11700 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11710 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
11720 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
11730 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
11740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11750 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
11760 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
11770 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
11780 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
11790 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
117a0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
117b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
117c0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
117d0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
117e0 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
117f0 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
11800 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11810 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
11820 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
11830 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
11840 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70  enCnt(pFile->pOp
11850 65 6e 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  en);.    closeUn
11860 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
11870 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
11880 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
118a0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
118b0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
118c0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
118d0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
118e0 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
118f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
11900 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
11910 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
11920 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
11930 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
11940 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11990 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
119a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119e0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
119f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a00 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
11a10 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
11a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a30 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
11a40 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
11a50 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
11a60 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
11a70 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
11a80 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
11a90 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
11aa0 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
11ab0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
11ac0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
11ad0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
11ae0 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
11af0 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
11b00 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
11b10 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
11b20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
11b30 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
11b40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
11b50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
11b60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
11b70 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
11b80 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
11b90 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
11ba0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
11bb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
11bc0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
11bd0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
11be0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
11bf0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
11c00 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a 20  ng sharedByte;. 
11c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
11c20 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
11c30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11c40 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
11c50 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
11c60 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
11c70 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11c80 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
11c90 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
11ca0 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
11cb0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
11cc0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
11cd0 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
11ce0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
11cf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
11d00 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
11d10 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
11d20 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
11d30 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
11d40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
11d50 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
11d60 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
11d70 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
11d80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
11d90 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
11da0 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
11db0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
11dc0 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
11dd0 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
11e00 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
11e10 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
11e20 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
11e30 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
11e40 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
11e50 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
11e60 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
11e70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
11e80 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
11e90 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
11ea0 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
11eb0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
11ec0 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
11ed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11ee0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
11ef0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
11f00 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
11f10 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
11f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
11f30 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
11f40 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
11f50 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
11f60 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
11f70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11f80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11f90 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
11fa0 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
11fb0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
11fc0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
11fd0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
11fe0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
11ff0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
12000 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
12010 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12020 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
12030 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
12040 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
12050 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
12060 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
12070 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
12080 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
12090 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
120a0 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
120b0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
120c0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
120d0 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
120e0 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
120f0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
12100 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
12110 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
12120 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
12130 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50  .  OSTRACE6("AFP
12140 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
12150 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
12160 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
12170 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
12180 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
12190 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
121a0 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
121b0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
121c0 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
121d0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
121e0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
121f0 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
12200 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
12210 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
12220 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12230 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
12240 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE4("AFPSETLOCK 
12250 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
12260 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
12270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
12280 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
12290 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23  rror(tErrno));.#
122a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
122b0 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
122c0 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
122d0 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
122e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
122f0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12300 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12320 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
12330 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
12340 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12350 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
12360 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
12370 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
12380 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
12390 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
123a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
123b0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
123c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
123d0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
123e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
123f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
12400 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12410 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
12420 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
12430 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
12440 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
12450 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
12460 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
12470 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
12480 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
12490 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
124a0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
124b0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
124c0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
124d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
124e0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
124f0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
12500 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
12510 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
12520 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
12530 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
12540 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12550 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12560 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
12570 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12580 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
12590 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
125a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
125b0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
125c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
125d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
125e0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
125f0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
12600 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12610 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
12620 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
12630 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
12640 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
12650 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
12660 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12670 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12680 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12690 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
126a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
126b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
126c0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
126d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
126e0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
126f0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
12700 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
12710 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
12720 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
12730 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
12740 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
12750 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12760 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12770 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
12780 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
12790 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
127a0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
127b0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
127c0 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
127d0 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
127e0 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
127f0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
12800 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
12810 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
12820 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
12830 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12840 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
12850 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
12860 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
12870 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
12880 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
12890 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
128a0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
128b0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
128c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
128d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
128e0 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
128f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
12900 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
12910 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
12920 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12930 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a  , reserved);.  .
12940 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12950 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12970 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12980 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12990 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
129a0 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
129b0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
129c0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
129d0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
129e0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
129f0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12a00 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12a10 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12a20 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12a30 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
12a40 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
12a50 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
12a60 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
12a70 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
12a80 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
12a90 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12aa0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12ab0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12ac0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12ad0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12ae0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12af0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12b00 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12b10 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12b20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12b30 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
12b40 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
12b50 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
12b60 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
12b70 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
12b80 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
12b90 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12ba0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12bb0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12bc0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12bd0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12be0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12bf0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12c00 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12c10 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
12c20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12c30 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12c40 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12c50 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
12c60 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
12c70 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
12c80 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
12c90 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
12ca0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12cb0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
12cc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12cd0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12ce0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12cf0 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
12d00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
12d10 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
12d20 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
12d30 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
12d40 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
12d50 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
12d60 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
12d70 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64  %s was %s pid=%d
12d80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
12d90 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
12da0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
12db0 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
12dc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67  le->locktype), g
12dd0 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20  etpid());..  /* 
12de0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
12df0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
12e00 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
12e10 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
12e20 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
12e30 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
12e40 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
12e50 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
12e60 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
12e70 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
12e80 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
12e90 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
12ea0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12eb0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
12ec0 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
12ed0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
12ee0 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
12ef0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
12f00 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
12f10 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
12f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12f30 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
12f40 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
12f50 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
12f60 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
12f70 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
12f80 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
12f90 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
12fa0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
12fb0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
12fc0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
12fd0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
12fe0 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
12ff0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
13000 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
13010 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
13020 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
13030 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
13040 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
13050 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
13060 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
13070 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
13080 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
13090 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
130a0 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
130b0 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
130c0 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
130d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
130e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69  TE_OK ){.    uni
130f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
13100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13110 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
13120 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
13130 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
13140 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
13150 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
13160 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
13170 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
13180 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
13190 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
131a0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
131b0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
131c0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
131d0 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
131e0 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
131f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
13200 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
13210 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
13220 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
13230 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
13240 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13250 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13260 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
13270 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
13280 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
13290 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
132a0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
132b0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
132c0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
132d0 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
132e0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
132f0 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
13300 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
13310 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
13320 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
13330 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
13340 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
13350 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
13360 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63  .    int lk, lrc
13370 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
13380 6e 6f 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  no;.    .    /* 
13390 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
133a0 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
133b0 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
133c0 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
133d0 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
133e0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
133f0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
13400 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
13410 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  ); .    context-
13420 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
13430 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
13440 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
13450 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
13460 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13470 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13480 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
13490 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74  ED_FIRST+context
134a0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
134b0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
134c0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
134d0 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
134e0 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
134f0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13500 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
13510 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
13520 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
13530 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13540 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13550 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
13560 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
13570 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13580 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
13590 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
135a0 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
135b0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
135c0 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
135d0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
135e0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
135f0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
13600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
13610 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
13620 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
13630 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
13640 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
13650 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
13660 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
13670 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
13680 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
13690 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
136a0 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
136b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
136c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
136d0 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
136e0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
136f0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
13700 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
13710 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
13720 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
13730 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
13740 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
13750 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
13760 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
13770 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
13780 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
13790 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
137a0 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
137b0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
137c0 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
137d0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
137e0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
137f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
13800 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
13810 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13820 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13830 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
13840 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
13850 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
13860 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
13870 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
13880 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
13890 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
138a0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
138b0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
138c0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
138d0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
138e0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
138f0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
13900 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
13910 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
13920 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
13930 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
13940 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
13950 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
13960 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13970 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
13980 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
139b0 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
139c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
139d0 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
139e0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
139f0 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
13a00 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
13a10 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
13a20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
13a30 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13a40 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13a50 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
13a60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
13a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
13aa0 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
13ab0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13ac0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13ad0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
13af0 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
13b00 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
13b10 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
13b20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
13b30 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
13b40 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
13b50 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
13b60 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
13b70 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
13b80 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
13b90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13ba0 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
13bb0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13bc0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
13bd0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
13be0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13bf0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
13c00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
13c10 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
13c20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
13c30 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13c40 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
13c50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13c60 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
13c70 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
13c80 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
13c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13ca0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
13cb0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
13cc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
13cd0 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
13ce0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
13cf0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
13d00 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
13d10 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
13d20 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
13d30 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
13d40 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
13d50 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
13d60 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
13d70 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
13d80 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
13d90 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
13da0 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
13db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
13dc0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13dd0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
13de0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
13df0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
13e00 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
13e10 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
13e20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
13e30 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
13e40 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
13e50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13e60 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
13e70 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
13e80 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
13e90 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
13ea0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
13ec0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13ed0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
13ee0 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72  ktype) {.  int r
13ef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13f00 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13f10 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13f20 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
13f30 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 61  ntext *pCtx = (a
13f40 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13f50 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
13f60 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
13f70 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13f80 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
13f90 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13fa0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
13fb0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
13fc0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
13fd0 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
13fe0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
13ff0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
14000 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
14010 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
14020 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
14030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14040 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
14050 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
14060 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14070 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
14080 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
14090 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
140a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
140b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a  ED_LOCK ){.    .
140c0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
140d0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
140e0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
140f0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
14100 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
14110 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
14120 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
14130 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
14140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14150 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14160 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
14170 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
14180 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
14190 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
141a0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
141b0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
141c0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
141d0 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65  pCtx->sharedByte
141e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
141f0 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  fpSetLock(pCtx->
14200 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
14210 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
14220 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
14230 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
14240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
14250 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  le->locktype>=PE
14260 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
14270 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
14280 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
14290 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
142a0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
142b0 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
142c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
142d0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
142e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
142f0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
14300 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
14310 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
14320 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
14330 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
14340 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
14350 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63  LOCK ){.    /* c
14360 6c 65 61 72 20 74 68 65 20 73 68 61 72 65 64 20  lear the shared 
14370 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
14380 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
14390 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43   SHARED_FIRST+pC
143a0 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  tx->sharedByte;.
143b0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
143c0 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
143d0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
143e0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
143f0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14410 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
14420 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73  _LOCK ){.      s
14430 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
14440 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
14450 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70  ->pOpen;.      p
14460 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
14470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
14480 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
14490 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
144a0 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
144b0 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
144c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
144d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
144e0 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ; i<pOpen->nPend
144f0 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ing; i++){.     
14500 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e       if( pOpen->
14510 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20  aPending[i] < 0 
14520 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14530 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
14540 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
14550 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
14560 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14570 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14580 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
14590 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
145a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
145b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
145c0 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
145d0 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  ] = -1;.        
145e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
145f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14620 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
14630 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  g);.          pO
14640 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
14650 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  0;.          pOp
14660 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
14670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14690 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
146a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
146b0 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c  TE_OK ) pFile->l
146c0 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
146d0 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
146e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
146f0 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
14700 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
14710 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
14720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
14730 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14740 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
14750 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
14760 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14770 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
14780 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
14790 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
147a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
147b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
147c0 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
147d0 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
147e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
147f0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
14800 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
14810 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
14820 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
14830 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
14840 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
14850 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
14860 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
14870 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
14880 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
14890 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
148a0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
148b0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
148c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
148d0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
148e0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
148f0 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20     int *aNew;.  
14900 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
14910 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
14920 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
14930 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
14940 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70 65 6e  e3_realloc(pOpen
14950 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70  ->aPending, (pOp
14960 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a  en->nPending+1)*
14970 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20  sizeof(int) );. 
14980 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
149a0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
149b0 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20  , just leak the 
149c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
149d0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
149e0 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
149f0 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a  Pending = aNew;.
14a00 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
14a10 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e  Pending[pOpen->n
14a20 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65  Pending] = pFile
14a30 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ->h;.        pOp
14a40 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a  en->nPending++;.
14a50 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14a60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
14a70 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
14a80 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70  OpenCnt(pFile->p
14a90 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  Open);.    sqlit
14aa0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
14ab0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
14ac0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
14ad0 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
14ae0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
14af0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14b00 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
14b10 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
14b20 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
14b30 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
14b40 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
14b50 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
14b60 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
14b70 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
14b80 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
14b90 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
14ba0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
14bb0 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
14bc0 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
14bd0 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
14be0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
14bf0 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
14c00 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
14c10 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
14c20 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
14c30 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c50 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
14c60 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14c70 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
14ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
14d40 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
14d50 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
14d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14d80 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
14d90 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
14da0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
14db0 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
14dc0 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
14dd0 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
14de0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
14df0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
14e00 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
14e10 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
14e20 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
14e30 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
14e40 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
14e50 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
14e60 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
14e70 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
14e80 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
14e90 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
14ea0 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
14eb0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
14ec0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
14ed0 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
14ee0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
14ef0 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
14f00 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
14f10 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
14f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14f30 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
14f40 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
14f50 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
14f60 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
14f70 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
14f80 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
14f90 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
14fa0 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
14fb0 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
14fc0 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
14fd0 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
14fe0 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
14ff0 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
15000 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
15010 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d  .** any any form
15020 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
15030 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
15040 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
15050 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
15060 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
15070 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20  nd #2681..**.** 
15080 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
15090 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
150a0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65  e on a failed re
150b0 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  ad the lastErrno
150c0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
150d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
150e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
150f0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
15100 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
15110 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
15120 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
15130 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
15140 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
15150 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
15160 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
15170 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
15180 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
15190 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
151a0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
151b0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
151c0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
151d0 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
151e0 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e  t = pread64(id->
151f0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
15200 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
15210 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
15220 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  -1 );.#else.  ne
15230 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
15240 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
15250 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75  EEK_SET);.  Simu
15260 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
15270 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66  Offset-- );.  if
15280 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
15290 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  set ){.    if( n
152a0 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
152b0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
152c0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
152d0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
152e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75  }else{.      ((u
152f0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15300 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
15310 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15320 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d   -1;.  }.  got =
15330 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75   read(id->h, pBu
15340 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
15350 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
15360 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15370 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15380 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
15390 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  no;.  }.  OSTRAC
153a0 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E5("READ    %-3d
153b0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
153c0 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
153d0 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
153e0 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
153f0 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   got;.}../*.** R
15400 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
15410 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
15420 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
15430 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
15440 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
15450 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
15460 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
15470 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
15480 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
15490 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
154a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
154b0 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
154c0 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
154d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
154e0 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20  offset.){.  int 
154f0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
15500 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65  d );.  got = see
15510 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
15520 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20  le*)id, offset, 
15530 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
15540 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
15550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15560 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
15570 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
15580 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
15590 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
155a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
155b0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
155c0 7d 65 6c 73 65 7b 0a 20 20 20 20 28 28 75 6e 69  }else{.    ((uni
155d0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
155e0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
155f0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
15600 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
15610 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
15620 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
15630 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
15640 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
15650 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
15660 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
15670 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15680 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
15690 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
156a0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
156b0 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
156c0 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
156d0 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
156e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
156f0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
15700 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
15710 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
15720 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
15730 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
15740 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
15750 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
15760 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
15770 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
15780 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
15790 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
157a0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
157b0 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
157c0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
157d0 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
157e0 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
157f0 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
15800 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
15810 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
15820 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70   pwrite(id->h, p
15830 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
15840 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
15850 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
15860 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69  got = pwrite64(i
15870 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
15880 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a   offset);.#else.
15890 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
158a0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
158b0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
158c0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
158d0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
158e0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
158f0 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
15900 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
15910 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
15920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
15930 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
15940 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
15950 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
15960 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
15970 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
15980 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
15990 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
159a0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
159b0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
159c0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
159d0 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53  errno;.  }..  OS
159e0 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
159f0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
15a00 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
15a10 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
15a20 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
15a30 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
15a40 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
15a50 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
15a60 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
15a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15a80 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
15a90 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
15aa0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
15ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
15ac0 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
15ad0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
15ae0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
15af0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
15b00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
15b10 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72  set .){.  int wr
15b20 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
15b30 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
15b40 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 23 69 66  t( amt>0 );..#if
15b50 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
15b60 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
15b70 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
15b80 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
15b90 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
15ba0 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
15bb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15bc0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
15bd0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
15be0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
15bf0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
15c00 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
15c10 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
15c20 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
15c30 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
15c40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15c50 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
15c60 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
15c70 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
15c80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 28 75 6e  .  */.  if( ((un
15c90 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69 6e 4e  ixFile*)id)->inN
15ca0 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
15cb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15cc0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15cd0 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  d;.    pFile->db
15ce0 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20  Update = 1;  /* 
15cf0 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  The database has
15d00 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a   been modified *
15d10 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
15d20 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61  <=24 && offset+a
15d30 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20  mt>=27 ){.      
15d40 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
15d50 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20  ar oldCntr[4];. 
15d60 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
15d70 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
15d80 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e       rc = seekAn
15d90 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c  dRead(pFile, 24,
15da0 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20   oldCntr, 4);.  
15db0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
15dc0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
15dd0 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c      if( rc!=4 ||
15de0 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c   memcmp(oldCntr,
15df0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
15e00 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d  24-offset], 4)!=
15e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
15e20 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
15e30 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74  g = 1;  /* The t
15e40 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
15e50 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a  er has changed *
15e60 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
15e70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
15e80 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
15e90 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
15ea0 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ite((unixFile*)i
15eb0 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  d, offset, pBuf,
15ec0 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20   amt))>0 ){.    
15ed0 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
15ee0 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74    offset += wrot
15ef0 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
15f00 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
15f10 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  te];.  }.  Simul
15f20 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f  ateIOError(( wro
15f30 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29  te=(-1), amt=1 )
15f40 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
15f50 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f  kfullError(( wro
15f60 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  te=0, amt=1 ));.
15f70 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
15f80 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29     if( wrote<0 )
15f90 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45  {.      /* lastE
15fa0 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
15fb0 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
15fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15fd0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
15fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
15ff0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
16000 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
16010 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
16020 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
16030 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
16040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16060 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16070 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
16080 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
16090 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
160a0 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
160b0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
160c0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
160d0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
160e0 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
160f0 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
16100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
16110 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
16120 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
16130 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
16140 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20  ndif../*.** Use 
16150 74 68 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  the fdatasync() 
16160 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  API only if the 
16170 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20 6d  HAVE_FDATASYNC m
16180 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
16190 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73  .** Otherwise us
161a0 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74 73  e fsync() in its
161b0 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64   place..*/.#ifnd
161c0 65 66 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e  ef HAVE_FDATASYN
161d0 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  C.# define fdata
161e0 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
161f0 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
16200 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
16210 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
16220 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
16230 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
16240 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
16250 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
16260 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
16270 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
16280 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
16290 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
162a0 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
162b0 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
162c0 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
162d0 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
162e0 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
162f0 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
16300 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
16310 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
16320 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
16330 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
16340 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
16350 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
16360 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
16370 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
16380 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
16390 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
163a0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
163b0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
163c0 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
163d0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
163e0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
163f0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
16400 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
16410 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
16420 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
16430 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
16440 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
16450 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
16460 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
16470 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
16480 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
16490 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
164a0 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
164b0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
164c0 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
164d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
164e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
164f0 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
16500 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
16510 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
16520 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
16530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
16540 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
16550 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
16560 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
16570 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
16580 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
16590 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
165a0 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
165b0 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
165c0 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
165d0 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
165e0 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
165f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16600 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
16610 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
16620 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16630 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
16640 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16650 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16660 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
16670 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
16680 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
16690 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
166a0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
166b0 79 6e 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ync);.#endif..  
166c0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
166d0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
166e0 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
166f0 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
16700 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
16710 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
16720 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
16730 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
16740 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
16750 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
16760 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
16770 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
16780 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16790 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
167a0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
167b0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
167c0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
167d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
167e0 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
167f0 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
16800 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
16810 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
16820 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
16830 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16840 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
16850 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
16860 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
16870 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
16880 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46  rc = fcntl(fd, F
16890 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
168a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
168b0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
168c0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
168d0 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
168e0 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
168f0 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
16900 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
16910 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
16920 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
16930 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
16940 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
16950 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
16960 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
16970 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
16980 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
16990 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
169a0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
169b0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
169c0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
169d0 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
169e0 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
169f0 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
16a00 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
16a10 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
16a20 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
16a30 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
16a40 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
16a50 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
16a60 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
16a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
16a80 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
16a90 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20  ;..#else .  if( 
16aa0 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  dataOnly ){.    
16ab0 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
16ac0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
16ad0 4b 53 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 2d  KS.    if( rc==-
16ae0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
16af0 53 55 50 20 29 7b 0a 20 20 20 20 20 20 72 63 20  SUP ){.      rc 
16b00 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  = fsync(fd);.   
16b10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
16b20 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  e{.    rc = fsyn
16b30 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
16b40 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
16b50 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
16b60 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
16b70 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
16b80 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
16b90 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
16ba0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16bb0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16bc0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
16bd0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
16be0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
16bf0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
16c00 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
16c10 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
16c20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
16c30 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
16c40 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
16c50 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
16c60 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
16c70 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
16c80 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
16c90 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
16ca0 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
16cb0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
16cc0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
16cd0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
16ce0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
16cf0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
16d00 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
16d10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
16d20 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
16d30 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
16d40 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
16d50 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
16d60 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
16d70 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
16d80 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
16d90 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
16da0 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
16db0 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
16dc0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
16dd0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
16de0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
16df0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
16e00 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
16e10 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
16e20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
16e30 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
16e40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
16e50 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
16e60 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
16e70 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
16e80 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
16ea0 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
16eb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
16ec0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
16ed0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16ee0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16ef0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
16f00 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
16f10 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
16f20 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
16f30 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
16f40 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
16f50 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
16f60 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
16f70 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
16f80 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
16f90 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
16fa0 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
16fb0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
16fc0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
16fd0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
16fe0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
16ff0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
17000 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
17010 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
17020 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
17030 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
17040 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
17050 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
17060 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
17070 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
17080 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
17090 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
170a0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
170b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
170c0 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59  ;.  OSTRACE2("SY
170d0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
170e0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d  File->h);.  rc =
170f0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
17100 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
17110 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
17120 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17130 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
17140 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
17150 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17160 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17170 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
17180 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  C;.  }.  if( pFi
17190 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a  le->dirfd>=0 ){.
171a0 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20      int err;.   
171b0 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59   OSTRACE4("DIRSY
171c0 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
171d0 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
171e0 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
171f0 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
17200 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
17210 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
17220 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
17230 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
17240 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
17250 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
17260 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
17270 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
17280 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
17290 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
172a0 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
172b0 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
172c0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
172d0 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
172e0 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
172f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17300 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
17310 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
17320 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
17330 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
17340 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
17350 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
17360 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
17370 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
17380 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
17390 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
173a0 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
173b0 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
173c0 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
173d0 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
173e0 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
173f0 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
17400 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
17410 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
17420 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
17430 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
17440 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
17450 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
17460 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17470 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
17480 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
17490 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
174a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
174b0 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
174c0 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
174d0 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
174e0 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
174f0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
17500 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
17510 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
17520 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
17530 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
17540 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
17550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17560 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17570 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
17580 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17590 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
175a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
175b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
175c0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
175d0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
175e0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
175f0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
17600 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17610 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
17620 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17630 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
17640 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17650 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17660 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
17670 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
17680 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
17690 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
176a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
176b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
176c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
176d0 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
176e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
176f0 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  CATE;.  }else{. 
17700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17710 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
17720 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
17730 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
17740 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
17750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
17760 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
17770 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
17780 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
17790 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
177a0 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
177b0 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73   id );.  rc = fs
177c0 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
177d0 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
177e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
177f0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
17800 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75  rc!=0 ){.    ((u
17810 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
17820 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
17830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17840 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
17850 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
17860 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
17870 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
17880 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
17890 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63  ase, the findLoc
178a0 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  kInfo() procedur
178b0 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
178c0 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
178d0 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
178e0 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
178f0 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
17900 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
17910 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
17920 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
17930 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
17940 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
17950 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
17960 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
17970 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
17980 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
17990 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
179a0 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
179b0 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
179c0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
179d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
179e0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
179f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
17a00 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
17a10 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
17a20 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
17a30 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
17a40 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
17a50 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
17a60 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
17a70 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
17a80 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
17a90 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
17aa0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
17ab0 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
17ac0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  dif.../*.** Info
17ad0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
17ae0 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
17af0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
17b00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
17b10 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
17b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17b30 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
17b40 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
17b50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17b60 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
17b70 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
17b80 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
17b90 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
17ba0 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
17bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
17bc0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17bd0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
17be0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
17bf0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
17c00 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
17c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17c20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
17c30 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
17c40 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
17c50 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
17c60 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
17c70 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
17c80 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
17c90 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
17ca0 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
17cb0 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
17cc0 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
17cd0 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
17ce0 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
17cf0 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
17d00 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
17d10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17d20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
17d30 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
17d40 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
17d50 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
17d60 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
17d70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
17d80 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
17d90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17da0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
17db0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
17dc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
17dd0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
17de0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17df0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
17e00 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
17e10 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
17e20 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
17e30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
17e40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17e50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
17e60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
17e70 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
17e80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
17e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17ea0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
17eb0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
17ec0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
17ed0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
17ee0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
17ef0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
17f00 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
17f10 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
17f20 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
17f30 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
17f40 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
17f50 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
17f60 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
17f70 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
17f80 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
17f90 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
17fa0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
17fb0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
17fc0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
17fd0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
17fe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
17ff0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
18000 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
18010 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
18020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18030 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
18040 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
18050 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
18060 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
18070 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18080 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
18090 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
180a0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
180b0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
180c0 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
180d0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
180e0 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73  0 for unix..*/.s
180f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
18100 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
18110 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
18120 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
18130 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
18140 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
18150 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  n 0;.}../*.** He
18160 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
18170 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
18180 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
18190 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
181a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181b0 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
181c0 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
181d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
181f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
18240 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
18250 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
18260 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
18270 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
18280 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
18290 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
182a0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
182b0 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
182c0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
182d0 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
182e0 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
182f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
18300 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
18310 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
18320 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
18330 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
18340 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
18350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18360 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
18370 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
18380 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
18390 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
183a0 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
183b0 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
183c0 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
183d0 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
183e0 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
183f0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
18400 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
18410 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
18420 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
18430 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
18440 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
18450 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
18460 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
18470 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
18480 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
18490 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
184a0 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
184b0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
184c0 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
184d0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
184e0 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20   finder-funtion 
184f0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
18500 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
18510 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
18520 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
18530 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
18540 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
18550 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
18560 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
18570 69 6f 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  io named just "F
18580 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
18590 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
185a0 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
185b0 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
185c0 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
185d0 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
185e0 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
185f0 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
18600 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
18610 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
18620 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
18630 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
18640 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
18650 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
18660 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
18670 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
18680 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
18690 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
186a0 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
186b0 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
186c0 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
186d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
186e0 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
186f0 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
18700 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
18710 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
18720 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
18730 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
18740 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
18750 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
18760 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
18770 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
18780 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
18790 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
187a0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
187b0 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
187c0 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
187d0 45 52 2c 20 4d 45 54 48 4f 44 2c 20 43 4c 4f 53  ER, METHOD, CLOS
187e0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
187f0 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 20 20   CKLOCK)        
18800 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
18810 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
18820 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
18830 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 20 20 20 20 20 20 5c 0a 20 20 20 31 2c 20 20 20        \.   1,   
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
18880 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
188d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
18900 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
18910 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
18950 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18960 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
189a0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
189b0 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
189c0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
18a40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18a50 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18a80 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
18ad0 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18af0 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18b20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b40 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
18b50 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
18b60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18b70 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
18b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18b90 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
18bc0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18be0 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
18c10 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
18c20 65 72 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44  eristics   /* xD
18c30 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
18c40 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
18c50 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
18c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
18cb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
18cc0 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
18cd0 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
18ce0 61 72 20 2a 7a 2c 20 69 6e 74 20 68 29 7b 20 20  ar *z, int h){  
18cf0 20 20 20 20 20 20 20 5c 0a 20 20 55 4e 55 53 45         \.  UNUSE
18d00 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
18d10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18d20 28 68 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (h);            
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
18d50 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
18df0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
18e00 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
18e10 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
18e20 72 2a 2c 69 6e 74 29 20 20 20 20 20 20 20 20 20  r*,int)         
18e30 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
18e40 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
18e50 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
18e60 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
18e70 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
18e80 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
18e90 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
18ea0 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
18eb0 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
18ec0 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
18ed0 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
18ee0 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
18ef0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
18f00 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
18f10 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
18f20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
18f30 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
18f40 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
18f50 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
18f60 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
18f70 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f90 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
18fa0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fc0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
18fd0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ff0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
19000 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
19010 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
19020 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
19030 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
19040 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
19050 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
19060 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
19070 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
19080 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
19090 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
190a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
190b0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
190c0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
190d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
190e0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
190f0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19110 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
19120 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
19130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19140 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
19150 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
19160 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f  ReservedLock   /
19170 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
19180 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
19190 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
191a0 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
191b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
191c0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
191d0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
191e0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
191f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
19200 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
19210 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
19220 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
19230 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
19240 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
19250 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
19260 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
19270 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
19280 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
19290 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
192a0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
192b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
192c0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
192d0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
192e0 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  )..#if SQLITE_EN
192f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
19300 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
19310 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
19320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
19330 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
19340 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
19350 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
19360 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
19370 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
19380 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  me */.  flockClo
19390 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
193a0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
193b0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
193c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
193d0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
193e0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
193f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
19400 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
19410 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
19420 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
19430 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
19440 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
19450 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
19460 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
19470 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
19480 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
19490 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
194a0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
194b0 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
194c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
194d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
194e0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
194f0 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  semClose,       
19500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
19510 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
19520 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  semLock,        
19530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
19540 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
19550 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  emUnlock,       
19560 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
19570 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
19580 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
19590 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
195a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
195b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
195c0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
195d0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
195e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
195f0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
19600 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
19610 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
19620 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
19630 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
19640 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
19650 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
19660 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
19670 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  ject name */.  a
19680 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
19690 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
196a0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
196b0 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
196c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
196d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
196e0 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
196f0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
19700 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
19710 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
19720 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
19730 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
19740 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
19750 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
19760 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
19770 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
19780 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
19790 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
197a0 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
197b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
197c0 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
197d0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
197e0 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
197f0 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
19800 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
19810 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
19820 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
19830 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
19840 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
19850 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
19860 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
19870 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
19880 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
19890 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
198a0 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
198b0 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
198c0 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
198d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
198e0 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
198f0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
19900 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
19910 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
19920 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
19930 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
19940 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19950 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19960 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19970 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
19980 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
19990 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
199a0 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
199b0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
199c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
199d0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
199e0 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
199f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
19a00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
19a10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
19a20 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
19a30 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
19a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19a50 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
19a60 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
19a70 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
19a80 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
19a90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
19aa0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
19ab0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
19ac0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
19ad0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
19ae0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
19af0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
19b00 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
19b10 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
19b20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
19b30 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
19b40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19b50 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
19b60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
19b70 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 0a  d */.).#endif...
19b80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
19b90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
19ba0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
19bb0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
19bc0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
19bd0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
19be0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
19bf0 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
19c00 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
19c10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
19c20 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
19c30 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
19c40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
19c50 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
19c60 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
19c70 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
19c80 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
19c90 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
19ca0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
19cb0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
19cc0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
19cd0 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
19ce0 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
19cf0 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
19d00 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19d10 20 69 6e 74 20 66 64 20 20 20 20 20 20 20 20 20   int fd         
19d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
19d30 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
19d40 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
19d50 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
19d60 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
19d70 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
19d80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
19d90 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
19da0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
19db0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
19dc0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
19dd0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
19de0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
19df0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
19e00 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
19e10 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
19e20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
19e30 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
19e40 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
19e50 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
19e60 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
19e70 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
19e80 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
19e90 5f 45 4e 41 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b  _ENABLE_AFP_LOCK
19ea0 49 4e 47 5f 53 4d 42 0a 20 20 20 20 7b 20 22 73  ING_SMB.    { "s
19eb0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
19ec0 74 68 6f 64 73 20 7d 2c 0a 23 65 6c 73 65 0a 20  thods },.#else. 
19ed0 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
19ee0 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  flockIoMethods }
19ef0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22  ,.#endif.    { "
19f00 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
19f10 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
19f20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
19f30 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
19f40 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
19f50 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
19f60 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
19f70 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
19f80 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
19f90 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
19fa0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
19fb0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
19fc0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
19fd0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
19fe0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
19ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
1a000 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
1a010 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
1a020 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
1a030 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
1a040 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
1a050 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
1a060 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
1a070 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
1a080 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1a090 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
1a0a0 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
1a0b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
1a0c0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
1a0d0 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
1a0e0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
1a0f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
1a100 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
1a110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a120 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
1a130 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
1a140 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
1a150 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
1a160 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
1a170 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
1a180 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
1a190 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
1a1a0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
1a1b0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
1a1c0 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
1a1d0 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
1a1e0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
1a1f0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
1a200 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
1a210 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
1a220 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
1a230 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
1a240 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c  LCK;.  if( fcntl
1a250 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
1a260 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
1a270 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
1a280 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
1a290 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1a2a0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
1a2b0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
1a2c0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1a2d0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
1a2e0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
1a2f0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
1a300 2c 69 6e 74 29 0a 20 20 20 20 20 20 20 20 3d 20  ,int).        = 
1a310 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1a320 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
1a330 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1a340 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1a350 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1a360 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
1a370 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
1a380 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
1a390 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
1a3a0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
1a3b0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
1a3c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1a3d0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
1a3e0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
1a3f0 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
1a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a440 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
1a460 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
1a470 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1a490 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
1a4a0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1a4b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1a4c0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
1a4d0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
1a4e0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
1a4f0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1a500 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1a510 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1a520 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1a530 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
1a540 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
1a550 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
1a560 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1a570 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
1a580 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
1a590 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
1a5a0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
1a5b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
1a5c0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
1a5d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  ed */.  int dirf
1a5e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a5f0 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
1a600 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1a610 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a620 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
1a630 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
1a640 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
1a650 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1a660 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
1a670 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1a680 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
1a690 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c  */.  int noLock,
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a6b0 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20  Omit locking if 
1a6c0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  true */.  int is
1a6d0 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20  Delete          
1a6e0 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
1a6f0 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
1a700 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
1a710 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
1a720 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
1a730 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
1a740 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
1a750 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a760 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a770 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d  t( pNew->pLock==
1a780 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
1a790 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e  ( pNew->pOpen==N
1a7a0 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ULL );..  /* Par
1a7b0 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65 20  ameter isDelete 
1a7c0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20  is only used on 
1a7d0 76 78 77 6f 72 6b 73 2e 0a 20 20 2a 2a 20 45 78  vxworks..  ** Ex
1a7e0 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69  press this expli
1a7f0 63 69 74 6c 79 20 68 65 72 65 20 74 6f 20 70 72  citly here to pr
1a800 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77  event compiler w
1a810 61 72 6e 69 6e 67 73 0a 20 20 2a 2a 20 61 62 6f  arnings.  ** abo
1a820 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
1a830 74 65 72 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  ters..  */.#if !
1a840 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 55 4e 55  OS_VXWORKS.  UNU
1a850 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
1a860 44 65 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  Delete);.#endif.
1a870 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45  .  OSTRACE3("OPE
1a880 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
1a890 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20   h, zFilename); 
1a8a0 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20     .  pNew->h = 
1a8b0 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
1a8c0 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f   = dirfd;.  SET_
1a8d0 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a  THREADID(pNew);.
1a8e0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1a8f0 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
1a900 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
1a910 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1a920 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
1a930 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31  {.    noLock = 1
1a940 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1a950 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
1a960 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  dif..  if( noLoc
1a970 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  k ){.    pLockin
1a980 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
1a990 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
1a9a0 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
1a9b0 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
1a9c0 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
1a9d0 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
1a9e0 6d 65 2c 20 68 29 3b 0a 23 69 66 20 53 51 4c 49  me, h);.#if SQLI
1a9f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1aa00 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
1aa10 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
1aa20 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
1aa30 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
1aa40 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
1aa50 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
1aa60 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
1aa70 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
1aa80 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
1aa90 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
1aaa0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
1aab0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
1aac0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
1aad0 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
1aae0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
1aaf0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
1ab00 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
1ab10 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
1ab20 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1ab30 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
1ab40 64 73 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  ds ){.    unixEn
1ab50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1ab60 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
1ab70 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
1ab80 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  Lock, &pNew->pOp
1ab90 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  en);.    unixLea
1aba0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
1abb0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1abc0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1abd0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1abe0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
1abf0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1ac00 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
1ac10 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
1ac20 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1ac30 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1ac40 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
1ac50 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
1ac60 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
1ac70 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
1ac80 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1ac90 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
1aca0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
1acb0 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
1acc0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1acd0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
1ace0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
1acf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ad00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1ad10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
1ad20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
1ad30 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
1ad40 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
1ad50 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
1ad60 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
1ad70 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
1ad80 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
1ad90 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
1ada0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
1adb0 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
1adc0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
1add0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
1ade0 61 6d 65 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  ame;.      srand
1adf0 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
1ae00 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1ae10 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
1ae20 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 4e  LockInfo(pNew, N
1ae30 55 4c 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ULL, &pNew->pOpe
1ae40 6e 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c 65  n);.      unixLe
1ae50 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
1ae60 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
1ae70 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
1ae80 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1ae90 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
1aea0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
1aeb0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
1aec0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
1aed0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
1aee0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
1aef0 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
1af00 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
1af10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
1af20 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
1af30 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
1af40 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
1af50 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
1af60 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
1af70 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
1af80 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
1af90 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
1afa0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
1afb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1afc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1afd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1afe0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1aff0 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
1b000 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
1b010 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
1b020 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
1b030 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
1b040 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
1b050 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
1b060 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
1b070 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
1b080 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
1b090 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
1b0a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
1b0b0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
1b0c0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
1b0d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1b0e0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
1b0f0 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
1b100 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
1b110 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1b120 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
1b130 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  kInfo(pNew, &pNe
1b140 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
1b150 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28  >pOpen);.    if(
1b160 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
1b170 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e   && (pNew->pOpen
1b180 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
1b190 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
1b1a0 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f  mName = pNew->pO
1b1b0 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  pen->aSemName;. 
1b1c0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1b1d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1b1e0 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
1b1f0 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 25 73 2e 73   zSemName, "%s.s
1b200 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
1b210 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
1b220 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
1b230 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
1b240 72 28 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=0; zSemName
1b250 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
1b260 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
1b270 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
1b280 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
1b290 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e     pNew->pOpen->
1b2a0 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
1b2b0 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
1b2c0 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
1b2d0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70     if( pNew->pOp
1b2e0 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  en->pSem == SEM_
1b2f0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
1b300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b310 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
1b320 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61  w->pOpen->aSemNa
1b330 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
1b340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b350 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1b360 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
1b370 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
1b380 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
1b390 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
1b3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b3b0 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
1b3c0 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65  e);.    isDelete
1b3d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
1b3e0 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44  ->isDelete = isD
1b3f0 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20  elete;.#endif.  
1b400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b410 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  K ){.    if( dir
1b420 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
1b430 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20  rfd); /* silent 
1b440 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
1b450 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
1b460 2f 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a  /.    close(h);.
1b470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
1b480 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
1b490 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
1b4a0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
1b4b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1b4d0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1b4e0 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1b4f0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1b500 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1b510 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b520 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1b530 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1b540 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1b550 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b560 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1b570 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1b580 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1b590 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1b5a0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1b5b0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1b5c0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1b5d0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1b5e0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1b5f0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1b600 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1b610 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1b620 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1b630 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1b640 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1b650 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1b660 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1b670 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1b680 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1b690 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1b6a0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1b6b0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1b6c0 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1b6d0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1b6e0 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1b6f0 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1b700 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1b710 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1b720 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1b730 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1b740 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1b750 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1b760 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1b770 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
1b780 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1b790 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
1b7a0 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
1b7b0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1b7c0 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
1b7d0 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c  SETFD, fcntl(fd,
1b7e0 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
1b7f0 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
1b800 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1b810 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  3("OPENDIR %-3d 
1b820 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1b830 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
1b840 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
1b850 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
1b860 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41  ITE_OK:SQLITE_CA
1b870 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NTOPEN);.}../*.*
1b880 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
1b890 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
1b8a0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
1b8b0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
1b8c0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1b8d0 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
1b8e0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
1b8f0 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
1b900 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
1b910 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
1b920 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1b930 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1b940 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1b950 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1b960 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
1b970 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
1b980 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
1b990 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
1b9a0 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
1b9b0 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20      ".",.  };.  
1b9c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1b9d0 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
1b9e0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
1b9f0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1ba00 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
1ba10 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
1ba20 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
1ba30 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
1ba40 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
1ba50 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1ba60 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1ba70 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
1ba80 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1ba90 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1baa0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1bab0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1bac0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1bad0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1bae0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1baf0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1bb00 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1bb10 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1bb20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1bb30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1bb40 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
1bb50 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
1bb60 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1bb70 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c  ctory;.  if (NUL
1bb80 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20  L == azDirs[1]) 
1bb90 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20  {.    azDirs[1] 
1bba0 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
1bbb0 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72  ");.  }.  .  for
1bbc0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
1bbd0 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
1bbe0 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Dirs[0]); i++){.
1bbf0 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69      if( azDirs[i
1bc00 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
1bc10 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a  .    if( stat(az
1bc20 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29  Dirs[i], &buf) )
1bc30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1bc40 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
1bc50 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
1bc60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63  nue;.    if( acc
1bc70 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30  ess(azDirs[i], 0
1bc80 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
1bc90 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
1bca0 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  [i];.    break;.
1bcb0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1bcc0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
1bcd0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
1bce0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
1bcf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
1bd00 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
1bd10 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
1bd20 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
1bd30 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
1bd40 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
1bd50 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1bd60 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
1bd70 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
1bd80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bd90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
1bda0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
1bdb0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
1bdc0 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
1bdd0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1bde0 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
1bdf0 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
1be00 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
1be10 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1be20 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
1be30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
1be40 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1be50 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
1be60 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
1be70 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
1be80 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
1be90 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
1bea0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
1beb0 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
1bec0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
1bed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bee0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1bef0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1bf00 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1bf10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1bf20 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
1bf30 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
1bf40 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
1bf50 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
1bf60 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
1bf70 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
1bf80 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
1bf90 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
1bfa0 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
1bfb0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
1bfc0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
1bfd0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1bfe0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
1bff0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
1c000 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
1c010 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
1c020 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
1c030 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
1c040 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
1c050 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
1c060 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
1c070 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
1c080 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
1c090 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
1c0a0 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
1c0b0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
1c0c0 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
1c0d0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
1c0e0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
1c0f0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
1c100 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
1c110 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1c120 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
1c130 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
1c140 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
1c150 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
1c160 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
1c170 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
1c180 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
1c190 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
1c1a0 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
1c1b0 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
1c1c0 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
1c1d0 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
1c1e0 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
1c1f0 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
1c200 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
1c210 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
1c220 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
1c230 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
1c240 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
1c250 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
1c260 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
1c270 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
1c280 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
1c290 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
1c2a0 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
1c2b0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
1c2c0 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
1c2d0 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
1c2e0 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
1c2f0 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
1c300 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
1c310 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c320 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1c330 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
1c340 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
1c350 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
1c360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1c370 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
1c380 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
1c390 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1c3a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c3b0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
1c3c0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1c3d0 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
1c3e0 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
1c3f0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1c400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
1c410 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
1c420 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
1c430 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
1c440 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1c450 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
1c460 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
1c470 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
1c480 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20 20 20   int fd = 0;    
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1c4b0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
1c4c0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64  pen() */.  int d
1c4d0 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  irfd = -1;      
1c4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
1c4f0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1c500 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
1c510 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
1c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1c530 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
1c540 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
1c550 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
1c560 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
1c570 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
1c580 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
1c590 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1c5a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1c5b0 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
1c5c0 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
1c5d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c5e0 3b 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  ;..  int isExclu
1c5f0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
1c600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1c610 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
1c620 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
1c630 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1c640 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1c650 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
1c660 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1c670 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1c680 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
1c690 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
1c6a0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1c6b0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
1c6c0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
1c6d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1c6e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
1c6f0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
1c700 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
1c710 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
1c720 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c730 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
1c740 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1c750 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
1c760 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
1c770 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
1c780 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
1c790 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
1c7a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
1c7b0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
1c7c0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
1c7d0 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
1c7e0 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
1c7f0 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
1c800 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1c810 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1c820 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
1c830 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1c840 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
1c850 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
1c860 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
1c870 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
1c880 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
1c890 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
1c8a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
1c8b0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
1c8c0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1c8d0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
1c8e0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
1c8f0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1c900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1c910 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
1c920 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
1c930 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
1c940 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
1c950 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
1c960 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
1c970 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
1c980 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
1c990 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
1c9a0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
1c9b0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
1c9c0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
1c9d0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
1c9e0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
1c9f0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
1ca00 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
1ca10 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
1ca20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
1ca30 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
1ca40 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
1ca50 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
1ca60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
1ca70 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
1ca80 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
1ca90 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
1caa0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
1cab0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
1cac0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
1cad0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
1cae0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
1caf0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
1cb00 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
1cb10 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
1cb20 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
1cb30 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
1cb40 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  , and master jou
1cb50 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61  rnal are never a
1cb60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
1cb70 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20  * deleted.  */. 
1cb80 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
1cb90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1cba0 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  _DB || !isDelete
1cbb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
1cbc0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1cbd0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
1cbe0 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20   !isDelete );.  
1cbf0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
1cc00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1cc10 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73  R_JOURNAL || !is
1cc20 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
1cc30 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1cc40 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
1cc50 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
1cc60 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
1cc70 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
1cc80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1cc90 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
1cca0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1ccb0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
1ccc0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1ccd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1cce0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
1ccf0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1cd00 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
1cd10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1cd20 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1cd30 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
1cd40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1cd50 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
1cd60 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1cd70 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1cd80 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65  NT_DB.  );..  me
1cd90 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
1cda0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
1cdb0 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  ;..  if( !zName 
1cdc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
1cdd0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1cde0 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
1cdf0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
1ce00 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
1ce10 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
1ce20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ce30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1ce40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ce50 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
1ce60 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  e;.  }..  if( is
1ce70 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
1ce80 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
1ce90 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
1cea0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
1ceb0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
1cec0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
1ced0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
1cee0 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
1cef0 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
1cf00 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
1cf10 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
1cf20 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
1cf30 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
1cf40 29 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28  );..  fd = open(
1cf50 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
1cf60 2c 20 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a  , isDelete?0600:
1cf70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1cf80 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
1cf90 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50  ;.  OSTRACE4("OP
1cfa0 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
1cfb0 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
1cfc0 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
1cfd0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
1cfe0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
1cff0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
1d000 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
1d010 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
1d020 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
1d030 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
1d040 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
1d050 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  */.    flags &= 
1d060 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
1d070 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1d080 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
1d090 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
1d0a0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
1d0b0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f      return unixO
1d0c0 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c  pen(pVfs, zPath,
1d0d0 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70   pFile, flags, p
1d0e0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
1d0f0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
1d100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d110 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69  ANTOPEN;.  }.  i
1d120 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
1d130 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1d140 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
1d150 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e  .#else.    unlin
1d160 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
1d170 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1d180 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d190 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
1d1a0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
1d1b0 6c 65 29 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  le)->openFlags =
1d1c0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
1d1d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 75  #endif.  if( pOu
1d1e0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
1d1f0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
1d200 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1d210 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73  fd!=0);.  if( is
1d220 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
1d230 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
1d240 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
1d250 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1d260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d270 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
1d280 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
1d290 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
1d2a0 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
1d2b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d2c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1d2d0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1d2e0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
1d2f0 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  D, fcntl(fd, F_G
1d300 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
1d310 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
1d320 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
1d330 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1d340 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49  IN_DB;..#if SQLI
1d350 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
1d360 4c 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50  LOCKING.  if( zP
1d370 61 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f  ath!=NULL && !no
1d380 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  Lock ){.    char
1d390 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
1d3a0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
1d3b0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
1d3c0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
1d3d0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
1d3e0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
1d3f0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
1d400 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
1d410 73 20 75 73 65 20 70 72 6f 78 79 2c 20 0a 20 20  s use proxy, .  
1d420 20 20 2a 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76    ** 0 means nev
1d430 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
1d440 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
1d450 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
1d460 20 66 69 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20   files only.    
1d470 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
1d480 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
1d490 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
1d4a0 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
1d4b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4c0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
1d4d0 73 49 6e 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66  sInfo;..      if
1d4e0 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
1d4f0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
1d500 7b 0a 09 09 09 09 28 28 75 6e 69 78 46 69 6c 65  {.....((unixFile
1d510 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
1d520 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1d530 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
1d540 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
1d550 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
1d560 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
1d570 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
1d580 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
1d590 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
1d5a0 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
1d5b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d5c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1d5d0 45 53 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ESS;.      }.   
1d5e0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
1d5f0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
1d600 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
1d610 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
1d620 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
1d630 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
1d640 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
1d650 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
1d660 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
1d670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d690 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
1d6a0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
1d6b0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
1d6c0 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
1d6d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d6e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1d6f0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
1d700 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  rn fillInUnixFil
1d710 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
1d720 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
1d730 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74   noLock, isDelet
1d740 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  e);.}../*.** Del
1d750 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
1d760 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
1d770 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
1d780 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
1d790 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1d7a0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
1d7b0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
1d7c0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
1d7d0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
1d7e0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
1d7f0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
1d800 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
1d810 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
1d820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1d830 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
1d840 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
1d850 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
1d860 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
1d870 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d880 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
1d890 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
1d8a0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
1d8b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d8c0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
1d8d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1d8e0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
1d8f0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
1d900 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
1d910 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
1d920 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
1d930 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
1d940 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
1d950 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
1d960 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
1d970 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
1d980 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1d990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
1d9a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
1d9b0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
1d9c0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
1d9d0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
1d9e0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
1d9f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1da00 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
1da10 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
1da20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
1da30 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
1da40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1da50 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
1da60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1da70 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1da80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
1da90 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
1daa0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
1dab0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
1dac0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
1dad0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
1dae0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
1daf0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
1db00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
1db10 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
1db20 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
1db30 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
1db40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
1db50 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
1db60 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
1db70 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
1db80 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
1db90 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
1dba0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
1dbb0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
1dbc0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
1dbd0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
1dbe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1dbf0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
1dc00 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
1dc10 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
1dc20 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
1dc30 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
1dc40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1dc50 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
1dc60 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
1dc70 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
1dc80 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1dc90 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
1dca0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
1dcb0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
1dcc0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
1dcd0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
1dce0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
1dcf0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
1dd00 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
1dd10 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
1dd20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1dd30 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
1dd40 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1dd50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
1dd60 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
1dd70 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
1dd80 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1dd90 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
1dda0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
1ddb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ddc0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1ddd0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
1dde0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
1ddf0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
1de00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1de10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
1de20 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
1de30 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
1de40 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
1de50 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
1de60 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
1de70 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
1de80 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
1de90 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
1dea0 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
1deb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1dec0 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
1ded0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
1dee0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
1def0 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
1df00 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
1df10 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
1df20 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
1df30 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
1df40 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
1df50 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
1df60 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1df70 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
1df80 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
1df90 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
1dfa0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
1dfb0 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
1dfc0 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
1dfd0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
1dfe0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
1dff0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1e000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e010 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
1e020 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e030 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
1e040 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
1e050 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1e060 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1e070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e080 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
1e090 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
1e0a0 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e0c0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
1e0d0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
1e0e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
1e110 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
1e120 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1e130 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1e140 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1e150 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1e160 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1e170 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1e180 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1e190 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1e1a0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1e1b0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
1e1c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
1e1d0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
1e1e0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
1e1f0 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
1e200 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
1e210 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
1e220 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1e230 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1e240 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
1e250 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
1e260 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
1e270 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
1e280 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1e290 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
1e2a0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
1e2b0 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
1e2c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1e2d0 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
1e2e0 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
1e2f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e300 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
1e310 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
1e320 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
1e330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e340 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
1e350 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
1e360 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
1e370 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e380 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
1e390 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
1e3a0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
1e3b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e3c0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
1e3d0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1e3e0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
1e3f0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1e400 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1e410 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1e420 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1e430 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1e440 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1e450 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1e460 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
1e470 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
1e480 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
1e490 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
1e4a0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
1e4b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e4c0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
1e4d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1e4e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
1e4f0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
1e500 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
1e510 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
1e520 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
1e530 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
1e540 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
1e550 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
1e560 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
1e570 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
1e580 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
1e590 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
1e5a0 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
1e5b0 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
1e5c0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
1e5d0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
1e5e0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
1e5f0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
1e600 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
1e610 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1e620 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
1e630 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
1e640 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
1e650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1e660 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
1e670 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
1e680 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1e690 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72  zBufOut){.  char
1e6a0 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
1e6b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1e6c0 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
1e6d0 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
1e6e0 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
1e6f0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
1e700 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1e710 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
1e720 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
1e730 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1e740 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
1e750 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
1e760 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
1e770 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
1e780 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
1e790 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
1e7a0 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
1e7b0 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
1e7c0 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
1e7d0 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
1e7e0 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
1e7f0 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1e800 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
1e810 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
1e820 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
1e830 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
1e840 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
1e850 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
1e860 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
1e870 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
1e880 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
1e890 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
1e8a0 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
1e8b0 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
1e8c0 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
1e8d0 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
1e8e0 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
1e8f0 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
1e900 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
1e910 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
1e920 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
1e930 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
1e940 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
1e950 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
1e960 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
1e970 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
1e980 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
1e990 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
1e9a0 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
1e9b0 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
1e9c0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
1e9d0 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
1e9e0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
1e9f0 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
1ea00 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
1ea10 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
1ea20 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
1ea30 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
1ea40 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
1ea50 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
1ea60 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
1ea70 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
1ea80 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
1ea90 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
1eaa0 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
1eab0 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
1eac0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
1ead0 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
1eae0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
1eaf0 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
1eb00 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
1eb10 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
1eb20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1eb30 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
1eb40 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
1eb50 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
1eb60 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
1eb70 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
1eb80 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
1eb90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
1eba0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
1ebb0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
1ebc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1ebd0 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
1ebe0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
1ebf0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
1ec00 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1ec10 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
1ec20 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
1ec30 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
1ec40 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
1ec50 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
1ec60 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
1ec70 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
1ec80 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
1ec90 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
1eca0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
1ecb0 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
1ecc0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
1ecd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ece0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
1ecf0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
1ed00 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
1ed10 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
1ed20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1ed30 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
1ed40 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
1ed50 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
1ed60 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
1ed70 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
1ed80 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
1ed90 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
1eda0 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
1edb0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
1edc0 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
1edd0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
1ede0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
1edf0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
1ee00 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
1ee10 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
1ee20 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
1ee30 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
1ee40 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
1ee50 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
1ee60 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
1ee70 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
1ee80 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
1ee90 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
1eea0 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
1eeb0 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
1eec0 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
1eed0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
1eee0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
1eef0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
1ef00 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
1ef10 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
1ef20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
1ef30 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
1ef40 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
1ef50 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
1ef60 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
1ef70 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
1ef80 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
1ef90 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
1efa0 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
1efb0 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
1efc0 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
1efd0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
1efe0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
1eff0 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
1f000 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1f010 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
1f020 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
1f030 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
1f040 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
1f050 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
1f060 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
1f070 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
1f080 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
1f090 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
1f0a0 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
1f0b0 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
1f0c0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
1f0d0 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
1f0e0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
1f0f0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1f100 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
1f110 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
1f120 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
1f130 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
1f140 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
1f150 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  e{.      nBuf = 
1f160 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
1f170 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
1f180 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
1f190 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1f1a0 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
1f1b0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1f1c0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1f1d0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1f1e0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
1f1f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1f200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
1f210 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
1f220 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
1f230 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1f240 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1f250 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
1f260 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
1f270 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
1f280 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
1f290 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
1f2a0 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
1f2b0 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
1f2c0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1f2d0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
1f2e0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
1f2f0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
1f300 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1f310 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
1f320 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1f330 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
1f340 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
1f350 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f360 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
1f370 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
1f380 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
1f390 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
1f3a0 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
1f3b0 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
1f3c0 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
1f3d0 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
1f3e0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
1f3f0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
1f400 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
1f410 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
1f420 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
1f430 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  onds);.  return 
1f440 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
1f450 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
1f460 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
1f470 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
1f480 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
1f490 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ds);.  return se
1f4a0 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
1f4b0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
1f4c0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1f4d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
1f4e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1f4f0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
1f500 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
1f510 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1f520 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
1f530 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
1f540 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
1f550 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
1f560 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
1f570 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
1f580 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
1f590 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1f5a0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1f5b0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1f5c0 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
1f5d0 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
1f5e0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
1f5f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1f600 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1f610 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1f620 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1f630 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1f640 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
1f650 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1f660 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
1f670 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
1f680 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
1f690 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1f6a0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1f6b0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1f6c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1f6d0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
1f6e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1f6f0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
1f700 6f 77 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ow){.#if defined
1f710 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
1f720 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
1f730 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
1f740 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
1f750 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  87.5;.#elif OS_V
1f760 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1f770 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
1f780 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
1f790 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
1f7a0 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  sNow);.  *prNow 
1f7b0 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
1f7c0 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
1f7d0 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  0 + sNow.tv_nsec
1f7e0 2f 38 36 34 30 30 30 30 30 30 30 30 30 30 30 2e  /86400000000000.
1f7f0 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
1f800 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
1f810 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
1f820 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e  sNow, 0);.  *prN
1f830 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
1f840 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
1f850 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  00.0 + sNow.tv_u
1f860 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e  sec/86400000000.
1f870 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
1f880 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1f890 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
1f8a0 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
1f8b0 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33  *prNow = sqlite3
1f8c0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36  _current_time/86
1f8d0 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
1f8e0 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  5;.  }.#endif.  
1f8f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f900 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1f910 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1f920 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
1f930 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
1f940 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
1f950 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
1f960 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
1f970 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
1f980 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
1f990 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
1f9a0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
1f9b0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
1f9c0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
1f9d0 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
1f9e0 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
1f9f0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
1fa00 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
1fa10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
1fa20 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
1fa30 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
1fa40 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
1fa50 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1fa60 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
1fa70 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1fa80 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
1fa90 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
1faa0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
1fab0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1fac0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
1fad0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1fae0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
1faf0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
1fb00 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1fb10 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
1fb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1fb30 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
1fb40 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1fb50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fb60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1fb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbb0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1fbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1fc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1fc20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
1fc30 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1fc40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc50 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ****.**.** Proxy
1fc60 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75   locking is a "u
1fc70 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
1fc80 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73  od" in this sens
1fc90 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a  e:  It uses the.
1fca0 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
1fcb0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f   methods on seco
1fcc0 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73  ndary lock files
1fcd0 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  .  Proxy locking
1fce0 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61   is a.** meta-la
1fcf0 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20  yer over top of 
1fd00 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
1fd10 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65  cking implemente
1fd20 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a  d above.  For.**
1fd30 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
1fd40 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
1fd50 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72  implements of pr
1fd60 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  oxy locking is d
1fd70 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c  eferred.** until
1fd80 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c   late in the fil
1fd90 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61  e (here) after a
1fda0 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ll of the other 
1fdb0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65  I/O methods have
1fdc0 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64  .** been defined
1fdd0 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70   - so that the p
1fde0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
1fdf0 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61   methods are ava
1fe00 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72  ilable.** as ser
1fe10 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69  vices to help wi
1fe20 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  th the implement
1fe30 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c  ation of proxy l
1fe40 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a  ocking..**.****.
1fe50 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1fe60 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  t locking scheme
1fe70 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20  s in SQLite use 
1fe80 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
1fe90 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
1fea0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72  ase file to coor
1feb0 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e  dinate safe, con
1fec0 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62  current access b
1fed0 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  y multiple reade
1fee0 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72  rs.** and writer
1fef0 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65  s [http://sqlite
1ff00 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68  .org/lockingv3.h
1ff10 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20  tml].  The five 
1ff20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
1ff30 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44  states (UNLOCKED
1ff40 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45  , PENDING, SHARE
1ff50 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43  D, RESERVED, EXC
1ff60 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c  LUSIVE) are impl
1ff70 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f  emented.** as PO
1ff80 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65  SIX read & write
1ff90 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65   locks over fixe
1ffa0 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f  d set of locatio
1ffb0 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a  ns (via fsctl),.
1ffc0 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d  ** on AFP and SM
1ffd0 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65  B only exclusive
1ffe0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
1fff0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
20000 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74  via fsctl.** wit
20010 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  h _IOWR('z', 23,
20020 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
20030 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61  eLockPB2) to tra
20040 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74  ck the same 5 st
20050 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75  ates..** To simu
20060 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f  late a F_RDLCK o
20070 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
20080 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e  ge, on AFP a ran
20090 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a  domly selected.*
200a0 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  * address in the
200b0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
200c0 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41   taken for a SHA
200d0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e  RED lock, the en
200e0 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72  tire.** shared r
200f0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
20100 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
20110 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ock):.**.**     
20120 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20   PENDING_BYTE   
20130 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09       0x40000000.
20140 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45  .   ..**      RE
20150 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
20160 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
20170 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
20180 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
20190 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
201a0 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
201b0 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
201c0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
201d0 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
201e0 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
201f0 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
20200 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
20210 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
20220 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
20230 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
20240 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
20250 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
20260 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
20270 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
20280 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
20290 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
202a0 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
202b0 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
202c0 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
202d0 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
202e0 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
202f0 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
20300 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
20310 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
20320 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
20330 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
20340 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
20350 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
20360 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
20370 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
20380 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
20390 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
203a0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
203b0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
203c0 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
203d0 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
203e0 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
203f0 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
20400 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
20410 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
20420 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
20430 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
20440 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
20450 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
20460 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
20470 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
20480 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
20490 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
204a0 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
204b0 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
204c0 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
204d0 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
204e0 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
204f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20500 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
20510 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
20520 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
20530 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
20540 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
20550 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
20560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
20570 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
20580 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
20590 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
205a0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
205b0 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
205e0 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
205f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
20600 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
20610 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
20620 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
20630 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
20640 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
20650 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
20660 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
20670 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
20680 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
20690 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
206a0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
206b0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
206c0 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
206d0 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
206e0 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
206f0 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
20700 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
20710 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
20720 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
20730 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
20740 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
20750 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
20760 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
20770 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
20780 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
20790 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
207a0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
207b0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
207c0 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
207d0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
207e0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
207f0 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
20800 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
20810 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
20820 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
20830 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
20840 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
20850 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
20860 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
20870 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
20880 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
20890 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
208a0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
208b0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
208c0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
208d0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
208e0 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
208f0 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
20900 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
20910 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
20920 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
20930 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
20940 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
20950 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
20960 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
20970 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
20980 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
20990 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
209a0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
209b0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
209c0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
209d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
209e0 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
209f0 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
20a00 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
20a10 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
20a20 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
20a30 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
20a40 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
20a50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20a60 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
20a70 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
20a80 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
20a90 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
20aa0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
20ab0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
20ac0 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
20ad0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
20ae0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
20af0 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
20b00 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
20b10 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
20b20 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
20b30 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
20b40 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
20b50 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
20b60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
20b70 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
20b80 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
20b90 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
20ba0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
20bb0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
20bc0 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
20bd0 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
20be0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
20bf0 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
20c00 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
20c10 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
20c20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
20c30 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
20c40 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
20c50 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
20c60 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
20c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
20c80 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
20c90 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
20ca0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
20cb0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
20cc0 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
20cd0 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
20ce0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
20cf0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
20d00 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
20d10 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
20d20 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
20d30 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
20d40 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
20d50 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
20d60 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
20d70 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
20d80 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
20d90 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
20da0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
20db0 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
20dc0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
20dd0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
20de0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
20df0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
20e00 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
20e10 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
20e20 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
20e30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
20e40 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
20e50 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
20e60 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
20e70 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
20e80 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
20e90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20ea0 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
20eb0 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
20ec0 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
20ed0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
20ee0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
20ef0 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
20f00 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
20f10 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
20f20 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
20f30 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
20f40 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
20f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
20f60 20 61 20 74 68 69 72 64 20 66 69 6c 65 20 2d 20   a third file - 
20f70 74 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65  the host ID file
20f80 20 2d 20 75 73 65 64 20 61 73 20 61 20 70 65 72   - used as a per
20f90 73 69 73 74 65 6e 74 20 72 65 63 6f 72 64 0a 2a  sistent record.*
20fa0 2a 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 64  * of a unique id
20fb0 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65  entifier for the
20fc0 20 68 6f 73 74 2c 20 61 20 31 32 38 2d 62 79 74   host, a 128-byt
20fd0 65 20 75 6e 69 71 75 65 20 68 6f 73 74 20 69 64  e unique host id
20fe0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20   file.** in the 
20ff0 70 61 74 68 20 64 65 66 69 6e 65 64 20 62 79 20  path defined by 
21000 74 68 65 20 48 4f 53 54 49 44 50 41 54 48 20 6d  the HOSTIDPATH m
21010 61 63 72 6f 20 28 64 65 66 61 75 6c 74 20 76 61  acro (default va
21020 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c 69 62 72 61  lue is.** /Libra
21030 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61  ry/Caches/.com.a
21040 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68  pple.sqliteConch
21050 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a 2a 20 52  HostId)..**.** R
21060 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
21070 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
21080 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
21090 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
210a0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
210b0 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
210c0 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
210d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
210e0 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
210f0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
21100 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
21110 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
21120 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
21130 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
21140 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
21150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
21160 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
21170 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
21180 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
21190 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
211a0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
211b0 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
211c0 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
211d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
211e0 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
211f0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
21200 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
21210 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
21220 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
21230 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
21240 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
21250 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
21260 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
21270 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
21280 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
21290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
212a0 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
212b0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
212c0 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
212d0 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
212e0 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
212f0 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
21300 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
21310 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
21320 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
21330 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
21340 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
21350 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
21360 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
21370 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
21380 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
21390 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
213a0 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
213b0 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
213c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
213d0 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
213e0 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
213f0 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
21400 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
21410 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
21420 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 48 4f  eation.**.**  HO
21430 53 54 49 44 50 41 54 48 0a 2a 2a 0a 2a 2a 20 20  STIDPATH.**.**  
21440 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
21450 68 65 20 64 65 66 61 75 6c 74 20 68 6f 73 74 20  he default host 
21460 49 44 20 66 69 6c 65 20 70 61 74 68 20 6c 6f 63  ID file path loc
21470 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
21480 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
21490 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
214a0 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
214b0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
214c0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
214d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
214e0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
214f0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
21500 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
21510 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
21520 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
21530 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
21540 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
21550 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
21560 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
21570 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
21580 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
21590 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
215a0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
215b0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
215c0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
215d0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
215e0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
215f0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
21600 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
21610 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
21620 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
21630 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
21640 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
21650 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
21660 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
21670 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
21680 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
21690 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
216a0 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
216b0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
216c0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
216d0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
216e0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
216f0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
21700 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
21710 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
21720 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
21730 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
21740 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
21750 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
21760 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
21770 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
21780 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
21790 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
217a0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
217b0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
217c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
217d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
217e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 23  LOCKING_STYLE..#
217f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21800 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
21810 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
21820 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
21830 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
21840 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
21850 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
21860 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
21870 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
21880 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
21890 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
218a0 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
218b0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
218c0 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
218d0 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
218e0 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
218f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
21900 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
21910 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
21920 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
21930 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
21940 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
21950 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
21960 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
21970 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
21980 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21990 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
219a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
219b0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
219c0 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
219d0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
219e0 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
219f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21a00 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
21a10 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
21a20 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
21a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21a40 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
21a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
21a60 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
21a70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21a80 74 68 65 20 63 6f 6e 63 68 20 69 73 20 63 75 72  the conch is cur
21a90 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a 20  rently held */. 
21aa0 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
21ab0 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
21ac0 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
21ad0 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
21ae0 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
21af0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
21b00 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
21b10 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
21b20 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
21b30 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
21b40 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c 45  .};../* HOSTIDLE
21b50 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20 62  N and CONCHLEN b
21b60 6f 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61 63  oth include spac
21b70 65 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67  e for the string
21b80 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e 67   .** terminating
21b90 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e 65   nul .*/.#define
21ba0 20 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20 20   HOSTIDLEN      
21bb0 20 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20 43     128.#define C
21bc0 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20 20  ONCHLEN         
21bd0 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f 53   (MAXPATHLEN+HOS
21be0 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64 65  TIDLEN+1).#ifnde
21bf0 66 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20 64  f HOSTIDPATH.# d
21c00 65 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54 48  efine HOSTIDPATH
21c10 20 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72 79         "/Library
21c20 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70 70  /Caches/.com.app
21c30 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48 6f  le.sqliteConchHo
21c40 73 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a  stId".#endif../*
21c50 20 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f 70   basically a cop
21c60 79 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d 6e  y of unixRandomn
21c70 65 73 73 20 77 69 74 68 20 64 69 66 66 65 72 65  ess with differe
21c80 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61 76  nt.** test behav
21c90 69 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f 0a  ior built in */.
21ca0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
21cb0 47 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28 63  GenerateHostID(c
21cc0 68 61 72 20 2a 70 48 6f 73 74 49 44 29 7b 0a 20  har *pHostID){. 
21cd0 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 6c 65   int pid, fd, le
21ce0 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
21cf0 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e 73 69 67  ar *key = (unsig
21d00 6e 65 64 20 63 68 61 72 20 2a 29 70 48 6f 73 74  ned char *)pHost
21d10 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  ID;.  .  memset(
21d20 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49 44 4c 45  key, 0, HOSTIDLE
21d30 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  N);.  len = 0;. 
21d40 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
21d50 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
21d60 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  NLY);.  if( fd>=
21d70 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 72  0 ){.    len = r
21d80 65 61 64 28 66 64 2c 20 6b 65 79 2c 20 48 4f 53  ead(fd, key, HOS
21d90 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 63 6c 6f  TIDLEN);.    clo
21da0 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  se(fd); /* silen
21db0 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64 20  tly leak the fd 
21dc0 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20  if it fails */. 
21dd0 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20 3c 20 48   }.  if( len < H
21de0 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20  OSTIDLEN ){.    
21df0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 74 69  time_t t;.    ti
21e00 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&t);.    memc
21e10 70 79 28 6b 65 79 2c 20 26 74 2c 20 73 69 7a 65  py(key, &t, size
21e20 6f 66 28 74 29 29 3b 0a 20 20 20 20 70 69 64 20  of(t));.    pid 
21e30 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
21e40 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73 69 7a 65  memcpy(&key[size
21e50 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
21e60 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d 0a  zeof(pid));.  }.
21e70 20 20 0a 23 69 66 64 65 66 20 4d 41 4b 45 5f 50    .#ifdef MAKE_P
21e80 52 45 54 54 59 5f 48 4f 53 54 49 44 0a 20 20 7b  RETTY_HOSTID.  {
21e90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
21ea0 2f 2a 20 66 69 6c 74 65 72 20 74 68 65 20 62 79  /* filter the by
21eb0 74 65 73 20 69 6e 74 6f 20 70 72 69 6e 74 61 62  tes into printab
21ec0 6c 65 20 61 73 63 69 69 20 63 68 61 72 61 63 74  le ascii charact
21ed0 65 72 73 20 61 6e 64 20 4e 55 4c 20 74 65 72 6d  ers and NUL term
21ee0 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20 6b 65 79  inate */.    key
21ef0 5b 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 5d 20  [(HOSTIDLEN-1)] 
21f00 3d 20 30 78 30 30 3b 0a 20 20 20 20 66 6f 72 28  = 0x00;.    for(
21f10 20 69 3d 30 3b 20 69 3c 28 48 4f 53 54 49 44 4c   i=0; i<(HOSTIDL
21f20 45 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b 0a 20 20  EN-1); i++ ){.  
21f30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
21f40 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d 26 30 78  r pa = key[i]&0x
21f50 37 46 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61  7F;.      if( pa
21f60 3c 30 78 32 30 20 29 7b 0a 20 20 20 20 20 20 20  <0x20 ){.       
21f70 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b 69   key[i] = (key[i
21f80 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29 20  ]&0x80 == 0x80) 
21f90 3f 20 70 61 2b 30 78 34 30 20 3a 20 70 61 2b 30  ? pa+0x40 : pa+0
21fa0 78 32 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x20;.      }else
21fb0 20 69 66 28 20 70 61 3d 3d 30 78 37 46 20 29 7b   if( pa==0x7F ){
21fc0 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d 20  .        key[i] 
21fd0 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d  = (key[i]&0x80 =
21fe0 3d 20 30 78 38 30 29 20 3f 20 70 61 3d 30 78 32  = 0x80) ? pa=0x2
21ff0 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a 20 20 20  0 : pa+0x7E;.   
22000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
22010 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
22020 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
22030 77 72 69 74 65 73 20 74 68 65 20 68 6f 73 74 20  writes the host 
22040 69 64 20 70 61 74 68 20 74 6f 20 70 61 74 68 2c  id path to path,
22050 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 20   path should be 
22060 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65 64  an pre-allocated
22070 20 62 75 66 66 65 72 0a 2a 2a 20 77 69 74 68 20   buffer.** with 
22080 65 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f 72  enough space for
22090 20 61 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74   a path .*/.stat
220a0 69 63 20 76 6f 69 64 20 70 72 6f 78 79 47 65 74  ic void proxyGet
220b0 48 6f 73 74 49 44 50 61 74 68 28 63 68 61 72 20  HostIDPath(char 
220c0 2a 70 61 74 68 2c 20 73 69 7a 65 5f 74 20 6c 65  *path, size_t le
220d0 6e 29 7b 0a 20 20 73 74 72 6c 63 70 79 28 70 61  n){.  strlcpy(pa
220e0 74 68 2c 20 48 4f 53 54 49 44 50 41 54 48 2c 20  th, HOSTIDPATH, 
220f0 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  len);.#ifdef SQL
22100 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
22110 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
22120 6d 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  m>0 ){.    char 
22130 73 75 66 66 69 78 5b 32 5d 20 3d 20 22 31 22 3b  suffix[2] = "1";
22140 0a 20 20 20 20 73 75 66 66 69 78 5b 30 5d 20 3d  .    suffix[0] =
22150 20 73 75 66 66 69 78 5b 30 5d 20 2b 20 73 71 6c   suffix[0] + sql
22160 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b  ite3_hostid_num;
22170 0a 20 20 20 20 73 74 72 6c 63 61 74 28 70 61 74  .    strlcat(pat
22180 68 2c 20 73 75 66 66 69 78 2c 20 6c 65 6e 29 3b  h, suffix, len);
22190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
221a0 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49  TRACE3("GETHOSTI
221b0 44 50 41 54 48 20 20 25 73 20 70 69 64 3d 25 64  DPATH  %s pid=%d
221c0 5c 6e 22 2c 20 70 61 74 68 2c 20 67 65 74 70 69  \n", path, getpi
221d0 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67 65 74 20  d());.}../* get 
221e0 74 68 65 20 68 6f 73 74 20 49 44 20 66 72 6f 6d  the host ID from
221f0 20 61 20 73 71 6c 69 74 65 20 68 6f 73 74 69 64   a sqlite hostid
22200 20 66 69 6c 65 20 73 74 6f 72 65 64 20 69 6e 20   file stored in 
22210 74 68 65 20 0a 2a 2a 20 75 73 65 72 2d 73 70 65  the .** user-spe
22220 63 69 66 69 63 20 74 6d 70 20 64 69 72 65 63 74  cific tmp direct
22230 6f 72 79 2c 20 63 72 65 61 74 65 20 74 68 65 20  ory, create the 
22240 49 44 20 69 66 20 69 74 27 73 20 6e 6f 74 20 74  ID if it's not t
22250 68 65 72 65 20 61 6c 72 65 61 64 79 20 0a 2a 2f  here already .*/
22260 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
22270 79 47 65 74 48 6f 73 74 49 44 28 63 68 61 72 20  yGetHostID(char 
22280 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
22290 45 72 72 6f 72 29 7b 0a 20 20 69 6e 74 20 66 64  Error){.  int fd
222a0 3b 0a 20 20 63 68 61 72 20 70 61 74 68 5b 4d 41  ;.  char path[MA
222b0 58 50 41 54 48 4c 45 4e 5d 3b 20 0a 20 20 73 69  XPATHLEN]; .  si
222c0 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20  ze_t len;.  int 
222d0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rc=SQLITE_OK;.. 
222e0 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 50   proxyGetHostIDP
222f0 61 74 68 28 70 61 74 68 2c 20 4d 41 58 50 41 54  ath(path, MAXPAT
22300 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79 20  HLEN);.  /* try 
22310 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 68 6f  to create the ho
22320 73 74 20 49 44 20 66 69 6c 65 2c 20 69 66 20 69  st ID file, if i
22330 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
22340 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
22350 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  ts */.  fd = ope
22360 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45 41 54 7c  n(path, O_CREAT|
22370 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 2c  O_WRONLY|O_EXCL,
22380 20 30 36 34 34 29 3b 0a 20 20 69 66 28 20 66 64   0644);.  if( fd
22390 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72  <0 ){.    int er
223a0 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20 20  r=errno;....    
223b0 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
223c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
223d0 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20  _PROXY_DEBUG /* 
223e0 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65  set the sqlite e
223f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73  rror message ins
22400 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66 70  tead */.      fp
22410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
22420 71 6c 69 74 65 20 65 72 72 6f 72 20 63 72 65 61  qlite error crea
22430 74 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c  ting host ID fil
22440 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  e %s: %s\n",.   
22450 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
22460 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b   strerror(err));
22470 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
22480 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
22490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 63  ;.    }.    /* c
224a0 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74  ouldn't create t
224b0 68 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69 74  he file, read it
224c0 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20   instead */.    
224d0 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
224e0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 29  O_RDONLY|O_EXCL)
224f0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
22500 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
22510 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20 73  PROXY_DEBUG /* s
22520 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65 72  et the sqlite er
22530 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73 74  ror message inst
22540 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ead */.      int
22550 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
22560 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
22570 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72 6f  rr, "sqlite erro
22580 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20 49  r opening host I
22590 44 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22  D file %s: %s\n"
225a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
225b0 70 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28 65  path, strerror(e
225c0 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rr));.#endif.   
225d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
225e0 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  _PERM;.    }.   
225f0 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 66 64 2c   len = pread(fd,
22600 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49 44   pHostID, HOSTID
22610 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  LEN, 0);.    if(
22620 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
22630 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b  *pError = errno;
22640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22650 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
22660 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e     }else if( len
22670 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20  <HOSTIDLEN ){.  
22680 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b      *pError = 0;
22690 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
226a0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
226b0 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EAD;.    }.    c
226c0 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
226d0 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  ently leak the f
226e0 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f  d if it fails */
226f0 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47  .    OSTRACE3("G
22700 45 54 48 4f 53 54 49 44 20 20 72 65 61 64 20 25  ETHOSTID  read %
22710 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f  s pid=%d\n", pHo
22720 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29 3b  stID, getpid());
22730 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22750 77 65 27 72 65 20 63 72 65 61 74 69 6e 67 20 74  we're creating t
22760 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  he host ID file 
22770 28 75 73 65 20 61 20 72 61 6e 64 6f 6d 20 73 74  (use a random st
22780 72 69 6e 67 20 6f 66 20 62 79 74 65 73 29 20 2a  ring of bytes) *
22790 2f 0a 20 20 20 20 70 72 6f 78 79 47 65 6e 65 72  /.    proxyGener
227a0 61 74 65 48 6f 73 74 49 44 28 70 48 6f 73 74 49  ateHostID(pHostI
227b0 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 77  D);.    len = pw
227c0 72 69 74 65 28 66 64 2c 20 70 48 6f 73 74 49 44  rite(fd, pHostID
227d0 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29 3b  , HOSTIDLEN, 0);
227e0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29  .    if( len<0 )
227f0 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
22800 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
22810 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22820 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
22830 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44  e if( len<HOSTID
22840 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  LEN ){.      *pE
22850 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rror = 0;.      
22860 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22870 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 20  R_WRITE;.    }. 
22880 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a     close(fd); /*
22890 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74   silently leak t
228a0 68 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c  he fd if it fail
228b0 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  s */.    OSTRACE
228c0 33 28 22 47 45 54 48 4f 53 54 49 44 20 20 77 72  3("GETHOSTID  wr
228d0 6f 74 65 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  ote %s pid=%d\n"
228e0 2c 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69  , pHostID, getpi
228f0 64 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  d());.    return
22900 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74   rc;.  }.}..stat
22910 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c  ic int proxyGetL
22920 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
22930 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
22940 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20   *lPath, size_t 
22950 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c  maxLen){.  int l
22960 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b  en;.  int dbLen;
22970 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
22980 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20  f LOCKPROXYDIR. 
22990 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
229a0 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44  Path, LOCKPROXYD
229b0 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c  IR, maxLen);.#el
229c0 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44  se.# ifdef _CS_D
229d0 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
229e0 44 49 52 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 66  DIR.  {.    conf
229f0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
22a00 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
22a10 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  ath, maxLen);.  
22a20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
22a30 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
22a40 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  ocks", maxLen);.
22a50 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 6c 50      if( mkdir(lP
22a60 61 74 68 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ath, SQLITE_DEFA
22a70 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
22a80 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
22a90 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69 72 20 66     /* if mkdir f
22aa0 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20 61 73 20  ails, handle as 
22ab0 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65 61 74 69  lock file creati
22ac0 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  on failure */.  
22ad0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
22ae0 72 6e 6f 3b 0a 23 20 20 69 66 64 65 66 20 53 51  rno;.#  ifdef SQ
22af0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
22b00 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
22b10 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
22b20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 70 72 6f  ntf(stderr, "pro
22b30 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 3a 20 6d  xyGetLockPath: m
22b40 6b 64 69 72 28 25 73 2c 30 25 6f 29 20 65 72 72  kdir(%s,0%o) err
22b50 6f 72 20 25 64 20 25 73 5c 6e 22 2c 20 6c 50 61  or %d %s\n", lPa
22b60 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
22b70 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
22b80 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
22b90 49 53 53 49 4f 4e 53 2c 20 65 72 72 2c 20 73 74  ISSIONS, err, st
22ba0 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 20 20  rerror(err));.  
22bb0 20 20 20 20 7d 0a 23 20 20 65 6e 64 69 66 0a 20      }.#  endif. 
22bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22bd0 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f 43  OSTRACE3("GETLOC
22be0 4b 50 41 54 48 20 20 6d 6b 64 69 72 20 25 73 20  KPATH  mkdir %s 
22bf0 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
22c00 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20  , getpid());.   
22c10 20 7d 0a 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c   }.    .  }.# el
22c20 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
22c30 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
22c40 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
22c50 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
22c60 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
22c70 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
22c80 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
22c90 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
22ca0 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
22cb0 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
22cc0 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
22cd0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
22ce0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
22cf0 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
22d00 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
22d10 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e  (i+len+7)<maxLen
22d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
22d30 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
22d40 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
22d50 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
22d60 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
22d70 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
22d80 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
22d90 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
22da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22db0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
22dc0 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
22dd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
22de0 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
22df0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
22e00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
22e10 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
22e20 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
22e30 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
22e40 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
22e50 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
22e60 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
22e70 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
22e80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22e90 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
22ea0 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
22eb0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
22ec0 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
22ed0 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
22ee0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
22ef0 74 65 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73 74  teUnixFile(const
22f00 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e 69   char *path, uni
22f10 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29 20  xFile **ppFile) 
22f20 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
22f30 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  t dirfd = -1;.  
22f40 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
22f50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22f60 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
22f70 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 0a 20  vfs dummyVfs;.. 
22f80 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
22f90 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
22fa0 54 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  T, SQLITE_DEFAUL
22fb0 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
22fc0 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  NS);.  if( fd<0 
22fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22fe0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
22ff0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
23000 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
23010 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
23020 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 69  (unixFile));.  i
23030 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
23040 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
23050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
23060 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
23070 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
23080 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
23090 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 64  unixFile));..  d
230a0 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
230b0 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
230c0 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 72  ockIoFinder;.  r
230d0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
230e0 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
230f0 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65  , dirfd, (sqlite
23100 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
23110 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  th, 0, 0);.  if(
23120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23130 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
23140 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
23150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23160 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
23170 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64  :    .  close(fd
23180 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
23190 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c  eak fd if error,
231a0 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69   we're already i
231b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
231c0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
231d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
231e0 0a 2f 2a 20 74 61 6b 65 73 20 74 68 65 20 63 6f  ./* takes the co
231f0 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
23200 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
23210 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
23220 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
23230 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
23240 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
23250 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
23260 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
23270 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
23280 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
23290 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
232a0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
232b0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
232c0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
232d0 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
232e0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
232f0 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
23300 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
23310 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
23320 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
23330 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
23340 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
23350 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
23360 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
23370 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
23380 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
23390 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
233a0 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
233b0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
233c0 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ld>0 ){.    retu
233d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
233e0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
233f0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
23400 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
23410 3b 0a 20 20 20 20 63 68 61 72 20 74 65 73 74 56  ;.    char testV
23420 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  alue[CONCHLEN];.
23430 20 20 20 20 63 68 61 72 20 63 6f 6e 63 68 56 61      char conchVa
23440 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  lue[CONCHLEN];. 
23450 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
23460 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
23470 20 20 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61 74    char *tLockPat
23480 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  h = NULL;.    in
23490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
234a0 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 52 63  ;.    int readRc
234b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
234c0 20 20 69 6e 74 20 73 79 6e 63 50 65 72 6d 73 20    int syncPerms 
234d0 3d 20 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41 43  = 0;..    OSTRAC
234e0 45 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E4("TAKECONCH  %
234f0 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
23500 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
23510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
23520 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
23530 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
23540 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
23550 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
23560 3b 0a 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  ;..    rc = conc
23570 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
23580 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
23590 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
235a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
235b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
235c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
235d0 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
235e0 20 20 20 6d 65 6d 73 65 74 28 74 65 73 74 56 61     memset(testVa
235f0 6c 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45 4e  lue, 0, CONCHLEN
23600 29 3b 20 2f 2a 20 63 6f 6e 63 68 20 69 73 20 66  ); /* conch is f
23610 69 78 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ixed size */.   
23620 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
23630 48 6f 73 74 49 44 28 74 65 73 74 56 61 6c 75 65  HostID(testValue
23640 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
23650 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
23660 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
23670 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
23680 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72  lastErrno = pErr
23690 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
236a0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
236b0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
236c0 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65       strlcpy(&te
236d0 73 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45  stValue[HOSTIDLE
236e0 4e 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  N], pCtx->lockPr
236f0 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
23700 4c 45 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LEN);.      }.  
23710 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
23720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23730 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
23740 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
23750 20 0a 20 20 20 20 72 65 61 64 52 63 20 3d 20 75   .    readRc = u
23760 6e 69 78 52 65 61 64 28 28 73 71 6c 69 74 65 33  nixRead((sqlite3
23770 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
23780 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43  e, conchValue, C
23790 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
237a0 20 69 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c   if( readRc!=SQL
237b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
237c0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 69 66  READ ){.      if
237d0 28 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45  ( readRc!=SQLITE
237e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
237f0 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
23800 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
23810 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
23820 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
23830 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
23840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23850 20 20 20 72 63 20 3d 20 72 65 61 64 52 63 3b 0a     rc = readRc;.
23860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23870 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
23880 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 20    }.      /* if 
23890 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
238a0 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
238b0 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
238c0 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
238d0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
238e0 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
238f0 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
23900 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
23910 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
23920 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
23930 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63    ** use the loc
23940 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
23950 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79  h that's already
23960 20 69 6e 20 74 68 65 72 65 20 2a 2f 0a 20 20 20   in there */.   
23970 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d 70       if( !memcmp
23980 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63  (testValue, conc
23990 68 56 61 6c 75 65 2c 20 48 4f 53 54 49 44 4c 45  hValue, HOSTIDLE
239a0 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
239b0 74 4c 6f 63 6b 50 61 74 68 20 3d 20 28 63 68 61  tLockPath = (cha
239c0 72 20 2a 29 26 63 6f 6e 63 68 56 61 6c 75 65 5b  r *)&conchValue[
239d0 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a 20 20 20 20  HOSTIDLEN];.    
239e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
239f0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
23a00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
23a10 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 65 27 76  .        /* we'v
23a20 65 20 67 6f 74 20 74 68 65 20 63 6f 6e 63 68 20  e got the conch 
23a30 69 66 20 63 6f 6e 63 68 56 61 6c 75 65 20 6d 61  if conchValue ma
23a40 74 63 68 65 73 20 6f 75 72 20 70 61 74 68 20 61  tches our path a
23a50 6e 64 20 68 6f 73 74 20 49 44 20 2a 2f 0a 20 20  nd host ID */.  
23a60 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d        if( !memcm
23a70 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e  p(testValue, con
23a80 63 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45  chValue, CONCHLE
23a90 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
23aa0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
23ab0 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ch;.        }.  
23ac0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
23ad0 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72  .      /* a shor
23ae0 74 20 72 65 61 64 20 6d 65 61 6e 73 20 77 65 27  t read means we'
23af0 72 65 20 22 63 72 65 61 74 69 6e 67 22 20 74 68  re "creating" th
23b00 65 20 63 6f 6e 63 68 20 28 65 76 65 6e 20 74 68  e conch (even th
23b10 6f 75 67 68 20 69 74 20 63 6f 75 6c 64 20 0a 20  ough it could . 
23b20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
23b30 6e 20 75 73 65 72 2d 69 6e 74 65 72 76 65 6e 74  n user-intervent
23b40 69 6f 6e 29 2c 20 69 66 20 77 65 20 61 63 71 75  ion), if we acqu
23b50 69 72 65 20 74 68 65 20 65 78 63 6c 75 73 69 76  ire the exclusiv
23b60 65 20 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 2a 2a  e lock,.      **
23b70 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 6d 61   we'll try to ma
23b80 74 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  tch the current 
23b90 6f 6e 2d 64 69 73 6b 20 70 65 72 6d 69 73 73 69  on-disk permissi
23ba0 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ons of the datab
23bb0 61 73 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ase.      */.   
23bc0 20 20 20 73 79 6e 63 50 65 72 6d 73 20 3d 20 31     syncPerms = 1
23bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
23be0 20 2f 2a 20 65 69 74 68 65 72 20 63 6f 6e 63 68   /* either conch
23bf0 20 77 61 73 20 65 6d 74 70 79 20 6f 72 20 64 69   was emtpy or di
23c00 64 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  dn't match */.  
23c10 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
23c20 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
23c30 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
23c40 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
23c50 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
23c60 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
23c70 74 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  tLockPath = lock
23c80 50 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72 6c  Path;.      strl
23c90 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48  cpy(&testValue[H
23ca0 4f 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50  OSTIDLEN], lockP
23cb0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
23cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
23cd0 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
23ce0 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
23cf0 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
23d00 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
23d10 63 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61 73  cess.     ** has
23d20 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
23d30 6c 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20 72  lready) */.    r
23d40 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
23d50 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
23d60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
23d70 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56  chFile, EXCLUSIV
23d80 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  E_LOCK);.    if(
23d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
23db0 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f  xWrite((sqlite3_
23dc0 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65  file *)conchFile
23dd0 2c 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f 4e  , testValue, CON
23de0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
23df0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e00 4f 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73 20  OK && syncPerms 
23e10 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
23e20 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
23e30 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73      int err = fs
23e40 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
23e50 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  uf);.        if(
23e60 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
23e70 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d       /* try to m
23e80 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73  atch the databas
23e90 65 20 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f  e file permissio
23ea0 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75  ns, ignore failu
23eb0 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  re */.#ifndef SQ
23ec0 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
23ed0 0a 20 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f  .          fchmo
23ee0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
23ef0 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23 65  buf.st_mode);.#e
23f00 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 69 66  lse.          if
23f10 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  ( fchmod(conchFi
23f20 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d 6f  le->h, buf.st_mo
23f30 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  de)!=0 ){.      
23f40 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
23f50 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
23f60 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
23f70 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46  rr, "fchmod %o F
23f80 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73  AILED with %d %s
23f90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20 63    buf.st_mode, c
23fc0 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
23fd0 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  de));.          
23fe0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
23ff0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
24000 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
24010 53 55 43 43 45 44 45 44 5c 6e 22 2c 62 75 66 2e  SUCCEDED\n",buf.
24020 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20  st_mode);.      
24030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
24040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
24050 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
24060 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
24070 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
24080 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
24090 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20   %d %s\n", .    
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c        err, code,
240c0 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
240d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
240e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
240f0 0a 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  .    conchFile->
24100 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
24110 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
24120 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
24130 44 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64 5f  D_LOCK);.  .end_
24140 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 4f  takeconch:.    O
24150 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50 52  STRACE2("TRANSPR
24160 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e  OXY: CLOSE  %d\n
24170 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
24180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24190 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70  _OK && pFile->op
241a0 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  enFlags ){.     
241b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
241c0 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43   ){.#ifdef STRIC
241d0 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20  T_CLOSE_ERROR.  
241e0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
241f0 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
24200 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
24210 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
24220 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
24230 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
24240 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOSE;.        }.
24250 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 63 6c  #else.        cl
24260 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f  ose(pFile->h); /
24270 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
24280 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65  fd if fail */.#e
24290 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
242a0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
242b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d  ;.      int fd =
242c0 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61   open(pCtx->dbPa
242d0 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  th, pFile->openF
242e0 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
242f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
24300 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
24310 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
24320 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e    OSTRACE2("TRAN
24330 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
24340 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20  \n", fd);.      
24350 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
24360 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
24370 66 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  fd;.      }else{
24380 0a 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49  .        rc=SQLI
24390 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2a 20  TE_CANTOPEN; /* 
243a0 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
243b0 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
243c0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67    during locking
243f0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
24400 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24410 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
24420 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
24430 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
24440 3d 20 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74 4c  = tLockPath ? tL
24450 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e  ockPath : pCtx->
24460 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
24470 20 20 20 20 20 2f 2a 20 41 43 53 3a 20 4e 65 65       /* ACS: Nee
24480 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
24490 20 6f 66 20 70 61 74 68 20 73 6f 6d 65 74 69 6d   of path sometim
244a0 65 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  es */.      rc =
244b0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
244c0 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78  File(path, &pCtx
244d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  ->lockProxy);.  
244e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
244f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24500 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
24510 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69  ld = 1;..      i
24520 66 28 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  f( tLockPath ){.
24530 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f          pCtx->lo
24540 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
24550 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
24560 20 74 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20   tLockPath);.   
24570 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
24580 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
24590 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
245a0 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ds ){.          
245b0 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
245c0 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
245d0 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
245e0 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 20 3d  ntext)->dbPath =
245f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24600 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
24610 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
24620 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24630 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
24640 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
24650 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
24660 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
24670 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
24680 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43      }.    OSTRAC
24690 45 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E3("TAKECONCH  %
246a0 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
246b0 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49 54  le->h, rc==SQLIT
246c0 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65  E_OK?"ok":"faile
246d0 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
246e0 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
246f0 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20   If pFile holds 
24700 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63  a lock on a conc
24710 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c  h file, then rel
24720 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a  ease that lock..
24730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
24740 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28  oxyReleaseConch(
24750 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
24760 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
24790 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70  turn code */.  p
247a0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
247b0 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68  xt *pCtx;  /* Th
247c0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
247d0 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20  t for the proxy 
247e0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69  lock */.  unixFi
247f0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
24800 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24810 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
24820 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72  */..  pCtx = (pr
24830 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
24840 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
24850 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e  ngContext;.  con
24860 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
24870 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52  onchFile;.  OSTR
24880 41 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE4("RELEASECON
24890 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
248a0 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
248b0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
248c0 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
248d0 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
248e0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
248f0 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20  :auto:"), .     
24900 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 3b        getpid());
24910 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  .  pCtx->conchHe
24920 6c 64 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 63  ld = 0;.  rc = c
24930 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
24940 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
24950 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
24960 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
24970 20 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45 41   OSTRACE3("RELEA
24980 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  SECONCH  %d %s\n
24990 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
249a0 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
249b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
249c0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
249d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
249e0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
249f0 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
24a00 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65  se file, compute
24a10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73   the name of its
24a20 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20   conch file..** 
24a30 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20  Store the conch 
24a40 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f  filename in memo
24a50 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
24a60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
24a70 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e  )..** Make *pCon
24a80 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20  chPath point to 
24a90 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52  the new name.  R
24aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
24ab0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
24ac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
24ad0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69   unable to obtai
24ae0 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  n memory..**.** 
24af0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
24b00 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
24b10 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
24b20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
24b30 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65  .** space is eve
24b40 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  ntually freed..*
24b50 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68  *.** *pConchPath
24b60 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
24b70 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
24b80 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
24b90 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
24ba0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f  nt proxyCreateCo
24bb0 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72  nchPathname(char
24bc0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
24bd0 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20  *pConchPath){.  
24be0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
24c10 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e  .  int len = (in
24c20 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
24c30 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64  ; /* Length of d
24c40 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
24c50 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63   - dbPath */.  c
24c60 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20  har *conchPath; 
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c80 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  buffer in which 
24c90 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e  to construct con
24ca0 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a  ch name */..  /*
24cb0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
24cc0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
24cd0 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69  lename and initi
24ce0 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74  alize the name t
24cf0 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  o.  ** the name 
24d00 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
24d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
24d20 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74  /  .  *pConchPat
24d30 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20  h = conchPath = 
24d40 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
24d50 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b  malloc(len + 8);
24d60 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68  .  if( conchPath
24d70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24d80 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
24d90 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e    }.  memcpy(con
24da0 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20  chPath, dbPath, 
24db0 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20  len+1);.  .  /* 
24dc0 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22  now insert a "."
24dd0 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
24de0 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a   / character */.
24df0 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29    for( i=(len-1)
24e00 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20  ; i>=0; i-- ){. 
24e10 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68     if( conchPath
24e20 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
24e30 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65    i++;.      bre
24e40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
24e50 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27  conchPath[i]='.'
24e60 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65  ;.  while ( i<le
24e70 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61  n ){.    conchPa
24e80 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69  th[i+1]=dbPath[i
24e90 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
24ea0 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65  .  /* append the
24eb0 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78   "-conch" suffix
24ec0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
24ed0 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50    memcpy(&conchP
24ee0 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63  ath[i+1], "-conc
24ef0 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74  h", 7);.  assert
24f00 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f  ( (int)strlen(co
24f10 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b  nchPath) == len+
24f20 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  7 );..  return S
24f30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
24f40 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63   Takes a fully c
24f50 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20  onfigured proxy 
24f60 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e  locking-style un
24f70 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74  ix file and swit
24f80 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  ches.** the loca
24f90 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
24fa0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
24fb0 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
24fc0 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
24fd0 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
24fe0 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
24ff0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
25000 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
25010 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
25020 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
25030 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50  xt;.  char *oldP
25040 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
25050 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74  ProxyPath;.  int
25060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25070 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ..  if( pFile->l
25080 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
25090 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
250a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
250b0 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20   ..  /* nothing 
250c0 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74  to do if the pat
250d0 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f  h is NULL, :auto
250e0 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65  : or matches the
250f0 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a   existing path *
25100 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  /.  if( !path ||
25110 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
25120 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
25130 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20  ":auto:") ||.   
25140 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74   (oldPath && !st
25150 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70  rncmp(oldPath, p
25160 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
25170 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
25190 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
251a0 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
251b0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
251c0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
251d0 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74  xy=NULL;.    pCt
251e0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
251f0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72  ;.    if( lockPr
25200 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  oxy!=NULL ){.   
25210 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d     rc=lockProxy-
25220 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
25230 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
25240 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
25250 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25260 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
25270 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
25280 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
25290 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64  sqlite3_free(old
252a0 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d  Path);.    pCtx-
252b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
252c0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
252d0 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20  (0, path);.  }. 
252e0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
252f0 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73  ../*.** pFile is
25300 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
25310 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
25320 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61  a prior xOpen ca
25330 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69  ll.  dbPath.** i
25340 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  s a string buffe
25350 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41  r at least MAXPA
25360 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65  THLEN+1 characte
25370 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  rs in size..**.*
25380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
25390 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ind the filename
253a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
253b0 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65   pFile and write
253c0 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61  s it.** int dbPa
253d0 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
253e0 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68  t proxyGetDbPath
253f0 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
25400 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
25410 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20  r *dbPath){.#if 
25420 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
25430 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  _).  if( pFile->
25440 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
25450 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
25460 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65  /* afp style kee
25470 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ps a reference t
25480 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e  o the db path in
25490 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69   the filePath fi
254a0 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  eld .    ** of t
254b0 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  he struct */.   
254c0 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
254d0 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
254e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
254f0 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
25500 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64 62 50  ;.    strcpy(dbP
25510 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e  ath, ((afpLockin
25520 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
25530 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25540 29 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 7d 65  )->dbPath);.  }e
25550 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
25560 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
25570 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
25580 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
25590 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
255a0 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
255b0 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
255c0 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
255d0 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
255e0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
255f0 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
25600 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
25610 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
25620 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
25630 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
25640 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
25650 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
25660 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
25670 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
25680 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
25690 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
256a0 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
256b0 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
256c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
256d0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
256e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
256f0 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
25700 0a 20 20 20 20 73 74 72 63 70 79 28 64 62 50 61  .    strcpy(dbPa
25710 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
25720 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
25730 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
25740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25750 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
25760 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
25770 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
25780 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
25790 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
257a0 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
257b0 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
257c0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
257d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
257e0 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
257f0 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
25800 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
25810 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
25820 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
25830 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
25840 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
25850 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
25860 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
25870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
25880 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
25890 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
258a0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
258b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
258c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
258d0 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
258e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
258f0 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
25900 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
25910 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25930 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
25940 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
25950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25960 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
25970 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
25980 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
25990 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
259a0 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62    }.  proxyGetDb
259b0 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28  PathForUnixFile(
259c0 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a  pFile, dbPath);.
259d0 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
259e0 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
259f0 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
25a00 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c  auto:") ){.    l
25a10 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
25a20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50  }else{.    lockP
25a30 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68  ath=(char *)path
25a40 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41  ;.  }.  .  OSTRA
25a50 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE4("TRANSPROXY 
25a60 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
25a70 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
25a80 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b             (lock
25a90 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20  Path ? lockPath 
25aa0 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
25ab0 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78 20  pid());..  pCtx 
25ac0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
25ad0 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
25ae0 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30  );.  if( pCtx==0
25af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25b00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
25b10 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20  .  memset(pCtx, 
25b20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  0, sizeof(*pCtx)
25b30 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79  );..  rc = proxy
25b40 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
25b50 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74  ame(dbPath, &pCt
25b60 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
25b70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25b90 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
25ba0 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e  ixFile(pCtx->con
25bb0 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74  chFilePath, &pCt
25bc0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
25bd0 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53   }  .  if( rc==S
25be0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
25bf0 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78  Path ){.    pCtx
25c00 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
25c10 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
25c20 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a  p(0, lockPath);.
25c30 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
25c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25c50 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73  /* all memory is
25c60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78   allocated, prox
25c70 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61  ys are created a
25c80 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20  nd assigned, .  
25c90 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20    ** switch the 
25ca0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
25cb0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
25cc0 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a   return..    */.
25cd0 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
25ce0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
25cf0 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20  up(0, dbPath);. 
25d00 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b     pCtx->oldLock
25d10 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69  ingContext = pFi
25d20 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
25d30 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  xt;.    pFile->l
25d40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
25d50 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e  pCtx;.    pCtx->
25d60 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69  pOldMethod = pFi
25d70 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20  le->pMethod;.   
25d80 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
25d90 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
25da0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
25db0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  if( pCtx->conchF
25dc0 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 72 63  ile ){ .      rc
25dd0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
25de0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
25df0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
25e00 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e *)pCtx->conchF
25e10 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
25e20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25e40 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
25e50 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
25e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
25e70 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
25e80 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ; .    sqlite3_f
25e90 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20  ree(pCtx);.  }. 
25ea0 20 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53   OSTRACE3("TRANS
25eb0 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c  PROXY  %d %s\n",
25ec0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
25ed0 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
25ee0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
25ef0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
25f00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
25f10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
25f20 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69  ndles sqlite3_fi
25f30 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c  le_control() cal
25f40 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  ls that are spec
25f50 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79  ific.** to proxy
25f60 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
25f70 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
25f80 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
25f90 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
25fa0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
25fb0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
25fc0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25fd0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
25fe0 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
25ff0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
26000 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
26010 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
26020 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
26030 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
26040 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
26050 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
26060 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
26070 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
26080 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
26090 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e      proxyTakeCon
260a0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
260b0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
260c0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
260d0 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
260e0 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70  char **)pArg = p
260f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
26100 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  th;.        }els
26110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  e{.          *(c
26120 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
26130 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74  g = ":auto: (not
26140 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20   held)";.       
26150 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
26160 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73  {.        *(cons
26170 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
26180 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
26190 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
261a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
261b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
261c0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
261d0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
261e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
261f0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
26200 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26210 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50  K;.      int isP
26220 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69  roxyStyle = (pFi
26230 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
26240 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
26250 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d  .      if( pArg=
26260 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20  =NULL || (const 
26270 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29  char *)pArg==0 )
26280 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
26290 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
262a0 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
262b0 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
262c0 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  g - not supporte
262d0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
262e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
262f0 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   /*SQLITE_PROTOC
26300 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  OL? SQLITE_MISUS
26310 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65  E?*/;.        }e
26320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
26330 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79  * turn off proxy
26340 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61   locking - alrea
26350 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f  dy off - NOOP */
26360 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26380 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
26390 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
263a0 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20  char *proxyPath 
263b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
263c0 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66  pArg;.        if
263d0 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
263e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78  {.          prox
263f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26400 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20  *pCtx = .       
26410 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69       (proxyLocki
26420 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
26430 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
26440 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26450 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a  !strcmp(pArg, ":
26460 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20  auto:") .       
26470 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f      || (pCtx->lo
26480 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20  ckProxyPath &&. 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73                !s
264a0 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63  trncmp(pCtx->loc
264b0 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78  kProxyPath, prox
264c0 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
264d0 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  N)).          ){
264e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
264f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26520 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
26530 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50  th(pFile, proxyP
26540 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
26550 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
26560 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
26570 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65  rn on proxy file
26580 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
26590 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
265a0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
265b0 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  e(pFile, proxyPa
265c0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  th);.        }. 
265d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
265e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
265f0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
26600 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
26610 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73   /* The call ass
26620 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76  ures that only v
26630 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65  alid opcodes are
26640 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20   sent */.    }. 
26650 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
26660 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D*/.  return SQL
26670 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
26680 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
26690 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72  division (the pr
266a0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69  oxying locking i
266b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74  mplementation) t
266c0 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a  he procedures.**
266d0 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e   above this poin
266e0 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74  t are all utilit
266f0 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72  ies.  The lock-r
26700 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f  elated methods o
26710 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c  f the.** proxy-l
26720 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69  ocking sqlite3_i
26730 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20  o_method object 
26740 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a  follow..*/.../*.
26750 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26760 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
26770 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
26780 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
26790 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
267a0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
267b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
267c0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
267d0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
267e0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
267f0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
26800 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
26810 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
26820 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
26830 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
26840 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
26850 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
26860 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
26870 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
26880 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
26890 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
268a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
268b0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
268c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
268d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
268e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
268f0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
26900 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
26910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
26920 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
26930 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
26940 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26950 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
26960 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
26970 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
26980 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
26990 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
269a0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
269b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
269c0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
269d0 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
269e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
269f0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
26a00 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
26a10 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
26a20 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
26a30 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
26a40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
26a50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
26a60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
26a70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
26a80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
26a90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
26aa0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
26ab0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
26ac0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
26ad0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
26ae0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
26af0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
26b00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
26b10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
26b20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
26b30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
26b40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
26b50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
26b60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
26b70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
26b80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
26b90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
26ba0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
26bb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
26bc0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
26bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
26be0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
26bf0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
26c00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
26c10 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
26c20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
26c30 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
26c40 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
26c50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
26c60 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
26c70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
26c80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
26c90 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
26ca0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
26cb0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
26cc0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
26cd0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
26ce0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
26cf0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
26d00 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
26d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26d20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
26d30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
26d40 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
26d50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
26d60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
26d70 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
26d80 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
26d90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
26db0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26dc0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
26dd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
26de0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
26df0 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
26e00 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
26e10 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
26e20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
26e30 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
26e40 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
26e50 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
26e60 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
26e70 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79   = proxy->lockty
26e80 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pe;.  }.  return
26e90 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
26ea0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
26eb0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
26ec0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
26ed0 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
26ee0 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
26ef0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
26f00 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
26f10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
26f20 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
26f30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
26f40 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
26f50 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
26f60 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
26f70 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
26f80 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
26f90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
26fa0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
26fb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
26fc0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
26fd0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
26fe0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
26ff0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
27000 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
27010 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
27020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27030 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
27040 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
27050 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
27060 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
27070 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
27080 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
27090 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
270a0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
270b0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
270c0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
270d0 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29  proxy, locktype)
270e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
270f0 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c  ktype = proxy->l
27100 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72  ocktype;.  }.  r
27110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27120 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
27130 74 68 61 74 20 75 73 65 73 20 70 72 6f 78 79 20  that uses proxy 
27140 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  locks..*/.static
27150 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
27160 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
27170 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
27180 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
27190 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
271a0 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  )id;.    proxyLo
271b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
271c0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
271d0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
271e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
271f0 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  t;.    unixFile 
27200 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
27210 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
27220 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
27230 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
27240 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  nchFile;.    int
27250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27260 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f  .    .    if( lo
27270 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  ckProxy ){.     
27280 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d   rc = lockProxy-
27290 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
272a0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
272b0 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c  )lockProxy, NO_L
272c0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
272d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
272e0 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50        rc = lockP
272f0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
27300 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
27310 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b  ile*)lockProxy);
27320 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27330 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f   sqlite3_free(lo
27350 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
27360 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
27370 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
27380 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a  f( conchFile ){.
27390 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
273a0 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20  conchHeld ){.   
273b0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52       rc = proxyR
273c0 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c  eleaseConch(pFil
273d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
273e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
273f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
27400 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
27410 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
27420 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
27430 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  chFile);.      i
27440 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27450 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
27460 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29  _free(conchFile)
27470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
27480 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c  te3_free(pCtx->l
27490 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20  ockProxyPath);. 
274a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
274b0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
274c0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
274d0 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50  3_free(pCtx->dbP
274e0 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
274f0 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
27500 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
27510 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
27520 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
27530 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
27540 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
27550 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
27560 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
27570 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
27580 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
27590 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
275a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
275b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
275c0 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
275d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
275e0 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
275f0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
27600 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
27610 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27620 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
27630 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
27640 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
27650 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
27660 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
27670 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
27680 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
27690 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
276a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
276b0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
276c0 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
276d0 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
276e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
276f0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
27700 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
27710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27720 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
27730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27770 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
27780 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
27790 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
277a0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
277b0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
277c0 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
277d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
277e0 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
277f0 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
27800 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
27810 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
27820 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
27830 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
27840 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
27850 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
27860 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
27870 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
27880 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
27890 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
278a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
278b0 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
278c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
278d0 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
278e0 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
278f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
27900 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
27910 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
27920 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
27930 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
27940 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
27950 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
27960 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
27970 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
27980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
27990 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
279a0 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
279b0 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
279c0 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
279d0 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
279e0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
279f0 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
27a00 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
27a10 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
27a20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
27a30 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
27a40 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
27a50 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
27a60 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
27a70 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
27a80 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
27a90 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
27aa0 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
27ab0 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
27ac0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
27ad0 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
27ae0 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
27af0 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
27b00 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
27b10 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
27b20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
27b30 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
27b40 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
27b50 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
27b60 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
27b70 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
27b80 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
27b90 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
27ba0 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
27bb0 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
27bc0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
27bd0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
27be0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
27bf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27c00 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
27c10 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
27c20 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
27c30 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
27c40 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
27c50 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
27c60 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
27c70 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
27c80 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
27c90 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
27ca0 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
27cb0 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
27cc0 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
27cd0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
27ce0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27cf0 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
27d00 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
27d10 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
27d20 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
27d30 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
27d40 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
27d50 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
27d60 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
27d70 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
27d80 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
27d90 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
27da0 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
27db0 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
27dc0 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
27dd0 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
27de0 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
27df0 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
27e00 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e20 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20        \.    1,  
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
27e70 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
27e80 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
27eb0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
27ec0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ee0 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
27f00 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27f20 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
27f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
27f40 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
27f50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27f60 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
27f70 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
27f80 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
27f90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
27fa0 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
27fb0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
27fc0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27fd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
27fe0 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
27ff0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
28000 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28010 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
28020 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
28030 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28050 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
28060 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
28070 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
28080 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28090 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
280a0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
280b0 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
280e0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
280f0 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28110 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
28120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
28130 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
28140 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28150 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
28160 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
28170 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
28180 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
28190 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
281a0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
281b0 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
281c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
281d0 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
281e0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
28210 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
28220 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
28230 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28240 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
28250 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20 20  tLastError      
28260 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
28270 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28280 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    \.  }..  /*.  
28290 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56  ** All default V
282a0 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72  FSes for unix ar
282b0 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
282c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
282d0 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ay..  **.  ** No
282e0 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
282f0 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69  te3_vfs.pNext fi
28300 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f  eld of the VFS o
28310 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65  bject is modifie
28320 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51  d.  ** by the SQ
28330 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74  Lite core when t
28340 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74  he VFS is regist
28350 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f  ered.  So the fo
28360 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72  llowing.  ** arr
28370 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ay cannot be con
28380 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  st..  */.  stati
28390 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56  c sqlite3_vfs aV
283a0 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c  fs[] = {.#if SQL
283b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
283c0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
283d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
283e0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
283f0 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f  ",          auto
28400 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
28410 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46  #else.    UNIXVF
28420 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20  S("unix",       
28430 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72     posixIoFinder
28440 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55   ),.#endif.    U
28450 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e  NIXVFS("unix-non
28460 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f  e",     nolockIo
28470 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
28480 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66  IXVFS("unix-dotf
28490 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f  ile",  dotlockIo
284a0 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53  Finder ),.#if OS
284b0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
284c0 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64  XVFS("unix-named
284d0 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65  sem", semIoFinde
284e0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20  r ),.#endif.#if 
284f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28500 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
28510 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f  UNIXVFS("unix-po
28520 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f  six",    posixIo
28530 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
28540 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63  IXVFS("unix-floc
28550 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69  k",    flockIoFi
28560 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
28570 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
28580 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
28590 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
285a0 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  E__).    UNIXVFS
285b0 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20  ("unix-afp",    
285c0 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c    afpIoFinder ),
285d0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
285e0 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
285f0 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
28600 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
28610 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
28620 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28630 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52  unter */..  /* R
28640 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
28650 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
28660 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
28670 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
28680 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
28690 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
286a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
286b0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
286c0 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
286d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
286e0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
286f0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
28700 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
28710 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
28720 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
28730 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
28740 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
28750 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
28760 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
28770 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
28780 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
28790 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
287a0 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
287b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
287c0 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
287d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
287e0 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
287f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
28800 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
28810 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.