/ Hex Artifact Content
Login

Artifact e5eef59cfb0f646b5010bc597b7c4a91534efc9b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a 0a  e3_os_end()..**.
07f0: 2a 2a 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78 2e  ** $Id: os_unix.
0800: 63 2c 76 20 31 2e 32 34 39 20 32 30 30 39 2f 30  c,v 1.249 2009/0
0810: 34 2f 30 37 20 30 30 3a 33 35 3a 32 30 20 64 72  4/07 00:35:20 dr
0820: 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  h Exp $.*/.#incl
0830: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0840: 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ".#if SQLITE_OS_
0850: 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20 20  UNIX            
0860: 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69    /* This file i
0870: 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20 6f  s used on unix o
0880: 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  nly */../*.** Th
0890: 65 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20  ere are various 
08a0: 6d 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65  methods for file
08b0: 20 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f   locking used fo
08c0: 72 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a  r concurrency.**
08d0: 20 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20   control:.**.** 
08e0: 20 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69    1. POSIX locki
08f0: 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29  ng (the default)
0900: 2c 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63  ,.**   2. No loc
0910: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f  king,.**   3. Do
0920: 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a  t-file locking,.
0930: 2a 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20  **   4. flock() 
0940: 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e  locking,.**   5.
0950: 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53   AFP locking (OS
0960: 58 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e  X only),.**   6.
0970: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
0980: 61 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73  aphores (VXWorks
0990: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20   only),.**   7. 
09a0: 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28  proxy locking. (
09b0: 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20  OSX only).**.** 
09c0: 53 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64  Styles 4, 5, and
09d0: 20 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69   7 are only avai
09e0: 6c 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f  lable of SQLITE_
09f0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0a00: 54 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TYLE.** is defin
0a10: 65 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51  ed to 1.  The SQ
0a20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0a30: 49 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65  ING_STYLE also e
0a40: 6e 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  nables automatic
0a50: 0a 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66  .** selection of
0a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
0a70: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62   locking style b
0a80: 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  ased on the file
0a90: 73 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20  system.** where 
0aa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0ab0: 6c 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69  located.  .*/.#i
0ac0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
0ad0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0ae0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0af0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b00: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0b10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0b20: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0b30: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0b40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0b50: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0b60: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0b70: 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f  .** Define the O
0b80: 53 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72  S_VXWORKS pre-pr
0b90: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f  ocessor macro to
0ba0: 20 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f   1 if building o
0bb0: 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f  n .** vxworks, o
0bc0: 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  r 0 otherwise..*
0bd0: 2f 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57  /.#ifndef OS_VXW
0be0: 4f 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e  ORKS.#  if defin
0bf0: 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64  ed(__RTP__) || d
0c00: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
0c10: 45 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  EL).#    define 
0c20: 4f 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20  OS_VXWORKS 1.#  
0c30: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
0c40: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20   OS_VXWORKS 0.# 
0c50: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f   endif.#endif../
0c60: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0c70: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0c80: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0c90: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0ca0: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0cb0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0cc0: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0cd0: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
0ce0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
0cf0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
0d00: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
0d10: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
0d20: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
0d30: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0d40: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0d50: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0d60: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0d70: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0d80: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0d90: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0da0: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0db0: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0dc0: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0dd0: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
0de0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
0df0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
0e00: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
0e10: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
0e20: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
0e30: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0e40: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0e50: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0e60: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0e70: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0e80: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0e90: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0ea0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0eb0: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0ec0: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0ed0: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
0ee0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a  d omit LFS..**.*
0ef0: 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70  * The previous p
0f00: 61 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69  aragraph was wri
0f10: 74 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28  tten in 2005.  (
0f20: 54 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69  This paragraph i
0f30: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20  s written.** on 
0f40: 32 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65  2008-11-28.) The
0f50: 73 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e  se days, all Lin
0f60: 75 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f  ux kernels suppo
0f70: 72 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20  rt large files, 
0f80: 73 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64  so.** you should
0f90: 20 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20   probably leave 
0fa0: 4c 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75  LFS enabled.  Bu
0fb0: 74 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20  t some embedded 
0fc0: 70 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a  platforms might.
0fd0: 2a 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77  ** lack LFS in w
0fe0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51  hich case the SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 20 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69   macro might sti
1010: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f  ll be useful..*/
1020: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1030: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65  DISABLE_LFS.# de
1040: 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45  fine _LARGE_FILE
1050: 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65         1.# ifnde
1060: 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  f _FILE_OFFSET_B
1070: 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f  ITS.#   define _
1080: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
1090: 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65   64.# endif.# de
10a0: 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f  fine _LARGEFILE_
10b0: 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a  SOURCE 1.#endif.
10c0: 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  ./*.** standard 
10d0: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a  include files..*
10e0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  /.#include <sys/
10f0: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
1100: 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23  e <sys/stat.h>.#
1110: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
1120: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  >.#include <unis
1130: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  td.h>.#include <
1140: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
1150: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69   <sys/time.h>.#i
1160: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
1170: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1180: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1190: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  E.# include <sys
11a0: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 66 20 4f  /ioctl.h>.# if O
11b0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e 63  S_VXWORKS.#  inc
11c0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
11d0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c  h>.#  include <l
11e0: 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65 0a  imits.h>.# else.
11f0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
1200: 66 69 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  file.h>.#  inclu
1210: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
1220: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
1230: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 20 65 6e 64 69  /mount.h>.# endi
1240: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
1250: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1260: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
1270: 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62  * If we are to b
1280: 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69  e thread-safe, i
1290: 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65  nclude the pthre
12a0: 61 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64  ads header and d
12b0: 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c  efine.** the SQL
12c0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
12d0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
12e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12f0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  .# include <pthr
1300: 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20  ead.h>.# define 
1310: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
1320: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ADS 1.#endif../*
1330: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
1340: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
1350: 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  ating a new file
1360: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1370: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
1380: 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65  PERMISSIONS.# de
1390: 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41  fine SQLITE_DEFA
13a0: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
13b0: 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66  IONS 0644.#endif
13c0: 0a 0a 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74  ../*. ** Default
13d0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
13e0: 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20  n creating auto 
13f0: 70 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69  proxy dir. */.#i
1400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1410: 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
1420: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1430: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1440: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1450: 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64  SSIONS 0755.#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
1470: 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68  m supported path
1480: 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66  -length..*/.#def
1490: 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ine MAX_PATHNAME
14a0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79   512../*.** Only
14b0: 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72   set the lastErr
14c0: 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  no if the error 
14d0: 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65  code is a real e
14e0: 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a  rror and not .**
14f0: 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74   a normal expect
1500: 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f  ed return code o
1510: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  f SQLITE_BUSY or
1520: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64   SQLITE_OK.*/.#d
1530: 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52  efine IS_LOCK_ER
1540: 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53  ROR(x)  ((x != S
1550: 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20  QLITE_OK) && (x 
1560: 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29  != SQLITE_BUSY))
1570: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  .../*.** The uni
1580: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1590: 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73  is subclass of s
15a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63  qlite3_file spec
15b0: 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78  ific to the unix
15c0: 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  .** VFS implemen
15d0: 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65  tations..*/.type
15e0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
15f0: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
1600: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
1610: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
1620: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
1630: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
1640: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1650: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1660: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  OpenCnt *pOpen; 
1670: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
1680: 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27  out all open fd'
1690: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
16a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
16b0: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
16c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
16d0: 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69  out locks on thi
16e0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
16f0: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1710: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
1720: 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ptor */.  int di
1730: 72 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  rfd;            
1740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1750: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
1760: 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  r the directory 
1770: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1780: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  ar locktype;    
1790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
17a0: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
17b0: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 69  n this fd */.  i
17c0: 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  nt lastErrno;   
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
17f0: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1800: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1810: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1820: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1830: 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  /* Locking style
1840: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20   specific state 
1850: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1860: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1870: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1880: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1890: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61        /* The fla
18a0: 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74 20  gs specified at 
18b0: 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66  open() */.#endif
18c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
18d0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
18e0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70  d(__linux__).  p
18f0: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
1920: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75  at "owns" this u
1930: 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  nixFile */.#endi
1940: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1950: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1980: 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1990: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
19a0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
19b0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
19c0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
19d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19e0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
19f0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1a00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1a10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1a20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1a30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1a40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1a50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1a60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1a70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1a80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1a90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1aa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1ab0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1ac0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1ad0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ae0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1af0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1b00: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
1b10: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
1b20: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
1b30: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
1b40: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
1b50: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
1b60: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
1b70: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
1b80: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
1b90: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
1ba0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
1bb0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
1bc0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
1bd0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
1be0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
1bf0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
1c00: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
1c10: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
1c20: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
1c30: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
1c40: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
1c50: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  on */..  /* If t
1c60: 72 75 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  rue, that means 
1c70: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1c80: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 66  ith a database f
1c90: 69 6c 65 20 74 68 61 74 20 68 61 73 0a 20 20 2a  ile that has.  *
1ca0: 2a 20 61 20 72 61 6e 67 65 20 6f 66 20 6c 6f 63  * a range of loc
1cb0: 6b 69 6e 67 20 62 79 74 65 73 20 66 72 6f 6d 20  king bytes from 
1cc0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 74 68 72  PENDING_BYTE thr
1cd0: 6f 75 67 68 20 50 45 4e 44 49 4e 47 5f 42 59 54  ough PENDING_BYT
1ce0: 45 2b 35 31 31 0a 20 20 2a 2a 20 77 68 69 63 68  E+511.  ** which
1cf0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
1d00: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d10: 2e 20 20 41 73 73 65 72 74 73 28 29 20 77 69 6c  .  Asserts() wil
1d20: 6c 20 76 65 72 69 66 79 20 74 68 69 73 20 2a 2f  l verify this */
1d30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1d40: 20 69 73 4c 6f 63 6b 61 62 6c 65 3b 20 20 20 20   isLockable;    
1d50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69 6c    /* True if fil
1d60: 65 20 6d 69 67 68 74 20 62 65 20 6c 6f 63 6b 65  e might be locke
1d70: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  d */.#endif.#ifd
1d80: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d90: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
1da0: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
1db0: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
1dc0: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
1dd0: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
1de0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1df0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
1e00: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
1e10: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
1e20: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
1e30: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1e40: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
1e50: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
1e60: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
1e70: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
1e80: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
1e90: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
1ea0: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
1eb0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
1ec0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
1ed0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
1ee0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
1ef0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
1f00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
1f10: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
1f20: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
1f30: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
1f40: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
1f50: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
1f60: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
1f70: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
1f80: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
1f90: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
1fa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1fb0: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
1fc0: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
1fd0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
1fe0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
1ff0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
2000: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
2010: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
2020: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
2030: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
2040: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
2050: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
2060: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
2070: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
2080: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
2090: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
20a0: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
20b0: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23  fdef __DJGPP__.#
20c0: 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c   define fcntl(A,
20d0: 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  B,C) 0.#endif../
20e0: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
20f0: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2100: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2110: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
2120: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2130: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2140: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
2150: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
2160: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
2170: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2180: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2190: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  did 0.#endif.../
21a0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
21b0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
21c0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
21d0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
21e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21f0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
2200: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
2210: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
2220: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
2230: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
2240: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
2250: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
2260: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
2270: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2280: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
2290: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
22a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
22b0: 45 52 29 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ER));.}...#ifdef
22c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
22d0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
22e0: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
22f0: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
2300: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
2310: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
2320: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
2330: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
2340: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
2350: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
2360: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
2370: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2380: 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d  har *locktypeNam
2390: 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  e(int locktype){
23a0: 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74  .  switch( lockt
23b0: 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f  ype ){.  case NO
23c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
23d0: 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41  ONE";.  case SHA
23e0: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
23f0: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73   "SHARED";.  cas
2400: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
2410: 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45   return "RESERVE
2420: 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49  D";.  case PENDI
2430: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
2440: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73  "PENDING";.  cas
2450: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
2460: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
2470: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
2480: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
2490: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
24a0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
24b0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
24c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
24d0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
24e0: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
24f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2500: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
2510: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
2520: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
2530: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
2540: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
2550: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
2560: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
2570: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
2580: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
2590: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
25a0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
25b0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
25c0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
25d0: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
25e0: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
25f0: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
2600: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
2610: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
2620: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
2630: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
2640: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
2650: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
2660: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
2670: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
2680: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
2690: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
26a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
26b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
26d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
26e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
26f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
2700: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
2710: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
2720: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2730: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
2740: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
2750: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
2760: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
2770: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
2780: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2790: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
27a0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
27b0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
27c0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
27d0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
27e0: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
27f0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
2800: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
2810: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2820: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
2830: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
2840: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
2850: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
2860: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
2870: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
2880: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
2890: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
28a0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
28b0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
28c0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
28d0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
28e0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
28f0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
2900: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
2910: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
2920: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
2930: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
2940: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
2950: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
2960: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
2970: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
2980: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2990: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
29a0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
29b0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
29c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
29d0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
29e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
29f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
2a00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a10: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
2a20: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
2a30: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
2a40: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
2a50: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
2a60: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
2a70: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
2a80: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
2a90: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
2aa0: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
2ab0: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
2ac0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2ad0: 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  E */..../*.** Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
2af0: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
2b00: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
2b10: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
2b20: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
2b30: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
2b40: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
2b50: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
2b60: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
2b70: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
2b80: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
2b90: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
2ba0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
2bb0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
2bc0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
2bd0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
2be0: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
2bf0: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
2c00: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
2c10: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
2c20: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2c30: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
2c40: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
2c50: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
2c60: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
2c70: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
2c80: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
2c90: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
2ca0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
2cb0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
2cc0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
2cd0: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
2ce0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
2cf0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a  ror) {.  case 0:
2d00: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
2d10: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63  ITE_OK;.    .  c
2d20: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
2d30: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
2d40: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
2d50: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
2d60: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
2d70: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
2d80: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
2d90: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
2da0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
2db0: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
2dc0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
2dd0: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
2de0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
2df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e00: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
2e10: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
2e20: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
2e30: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
2e40: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
2e50: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
2e60: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
2e70: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
2e80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
2e90: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  _LOCK) || ..(sql
2ea0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
2eb0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
2ec0: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
2ed0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
2ee0: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28  RR_RDLOCK) ||..(
2ef0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
2f00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
2f10: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
2f20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f30: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2f40: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
2f50: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
2f60: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
2f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2f80: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  ERM;.    .  case
2f90: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
2fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2fb0: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a  R_BLOCKED;.    .
2fc0: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
2fd0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
2fe0: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
2ff0: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
3000: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
3010: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
3020: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
3030: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
3040: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
3050: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
3060: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
3070: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
3080: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
3090: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
30a0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
30b0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
30c0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
30d0: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
30e0: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
30f0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3100: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3110: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
3120: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
3130: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
3140: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
3150: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
3160: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
3170: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
3180: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20    case ESTALE:. 
3190: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
31a0: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
31b0: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
31c0: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
31d0: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
31e0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
31f0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
3200: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
3210: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
3220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3260: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
3270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
3280: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
3290: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
32a0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
32b0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
32c0: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
32d0: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
32e0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
32f0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
3300: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
3310: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
3320: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
3330: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
3340: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
3350: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
3360: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
3370: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
3380: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
3390: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
33a0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
33b0: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
33c0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
33d0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
33e0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
33f0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3400: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
3410: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
3420: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
3430: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
3440: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
3450: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
3460: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
3470: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
3480: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
3490: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
34a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
34b0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
34c0: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
34d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
34e0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
34f0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
3500: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
3510: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
3520: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
3530: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
3540: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
3550: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
3560: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
3570: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
3580: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3590: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
35a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
35b0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
35c0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
35d0: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
35e0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
35f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3600: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
3610: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
3620: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3640: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
3650: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
3660: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
3670: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
3680: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
3690: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
36a0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
36b0: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
36c0: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
36d0: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
36e0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
36f0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
3700: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
3710: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
3720: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
3730: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
3740: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
3750: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
3760: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
3770: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
3780: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
3790: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
37a0: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
37b0: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
37c0: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
37d0: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
37e0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
37f0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
3800: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
3810: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
3820: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
3830: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
3840: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
3850: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
3860: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
3870: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
3880: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
3890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
38a0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
38b0: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
38c0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
38d0: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
38e0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
38f0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
3900: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
3910: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
3920: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
3930: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
3940: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
3950: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
3960: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
3970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
3980: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
3990: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
39a0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
39b0: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
39c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
39d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
39e0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
39f0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
3a00: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
3a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
3a20: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
3a30: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
3a40: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
3a50: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
3a60: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
3a70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
3a90: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
3aa0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
3ab0: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
3ac0: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
3ad0: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
3ae0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
3af0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
3b00: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3b10: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
3b20: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
3b30: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
3b40: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
3b50: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
3b60: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
3b70: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
3b80: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
3b90: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
3ba0: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
3bb0: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
3bc0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
3bd0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
3be0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
3bf0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
3c00: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
3c10: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
3c20: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
3c30: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
3c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
3c50: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
3c60: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
3c70: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
3c80: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
3c90: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
3ca0: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
3cb0: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
3cc0: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
3cd0: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
3ce0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
3cf0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
3d00: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
3d10: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
3d20: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3d50: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
3d60: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
3d70: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
3d80: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
3d90: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
3da0: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
3db0: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
3dc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
3dd0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
3de0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
3df0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3e00: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
3e10: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
3e20: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
3e30: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
3e40: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
3e50: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
3e60: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
3e70: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
3e80: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
3e90: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
3ea0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
3eb0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
3ec0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
3ed0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
3ee0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
3ef0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
3f00: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
3f10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
3f20: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
3f30: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
3f40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
3f50: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
3f60: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
3f70: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
3f80: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
3f90: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
3fa0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
3fb0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
3fc0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
3fd0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
3fe0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
3ff0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
4000: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
4010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4020: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
4030: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
4040: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
4050: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
4060: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
4070: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
4080: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
4090: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
40a0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
40b0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
40c0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
40d0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
40e0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
40f0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
4100: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
4110: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
4120: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
4130: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4140: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
4150: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4160: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
4170: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
4180: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
4190: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
41a0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
41b0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
41c0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
41d0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
41e0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
41f0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
4200: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
4210: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
4220: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
4230: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
4240: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
4250: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4260: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
4270: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
4280: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
4290: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
42a0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
42b0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
42c0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
42d0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
42e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
42f0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
4300: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
4310: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
4320: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
4330: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
4340: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
4350: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
4360: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
4370: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43c0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
43d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4410: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
4440: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
4450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4460: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
4470: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
4480: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
4490: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
44a0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
44b0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
44c0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
44d0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
44e0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
44f0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
4500: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
4510: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
4520: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
4530: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4550: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
4560: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
4570: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
4580: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
4590: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
45a0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
45b0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
45c0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
45d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
45e0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
45f0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
4600: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
4610: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
4620: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
4630: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
4640: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
4650: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
4660: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
4670: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
4680: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
4690: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
46a0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
46b0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
46c0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
46d0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
46e0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
46f0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
4700: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
4710: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
4720: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
4730: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
4740: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
4750: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
4760: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
4770: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
4780: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
4790: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
47a0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
47b0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
47c0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
47d0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
47e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
47f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
4800: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
4810: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
4820: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
4830: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
4840: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
4850: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
4860: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
4870: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
4880: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
4890: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
48a0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
48b0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
48c0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
48d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
48e0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
48f0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
4900: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
4910: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
4920: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
4930: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
4940: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
4950: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
4960: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
4970: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
4980: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
4990: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
49a0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
49b0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
49c0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
49d0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
49e0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
49f0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
4a00: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
4a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4a20: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
4a30: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
4a40: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
4a50: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
4a60: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
4a70: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
4a80: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
4a90: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
4aa0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
4ab0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
4ac0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
4ad0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
4ae0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
4af0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
4b00: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
4b10: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
4b20: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
4b30: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
4b40: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
4b50: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
4b60: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
4b70: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
4b80: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
4b90: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
4ba0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
4bb0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
4bc0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
4bd0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
4be0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
4bf0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
4c00: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
4c10: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
4c20: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
4c30: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
4c40: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
4c50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
4c60: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
4c70: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
4c80: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
4c90: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
4ca0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
4cb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
4cc0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
4cd0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
4ce0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
4cf0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
4d00: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
4d10: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
4d20: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
4d30: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
4d40: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
4d50: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
4d60: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
4d70: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
4d80: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
4d90: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
4da0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
4db0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
4dc0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
4dd0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
4de0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
4df0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
4e00: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
4e10: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
4e20: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
4e30: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
4e40: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
4e50: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
4e60: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
4e70: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
4e80: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
4e90: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
4ea0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
4eb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
4ec0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
4ed0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
4ee0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
4ef0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
4f00: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
4f10: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
4f20: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
4f30: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
4f40: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
4f50: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
4f60: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
4f70: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
4f80: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
4f90: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
4fa0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
4fb0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
4fc0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
4fd0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
4fe0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
4ff0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
5000: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
5010: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
5020: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
5030: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
5040: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
5050: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
5060: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
5070: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
5080: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
5090: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
50a0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
50b0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
50c0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
50d0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
50e0: 2c 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20  , each unixFile 
50f0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
5100: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
5110: 74 6f 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e  to an unixOpenCn
5120: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
5130: 65 72 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f  ere is one unixO
5140: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
5150: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
5160: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
5170: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e  that multiple un
5180: 69 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74  ixFile can point
5190: 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   to a single.** 
51a0: 75 6e 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68  unixOpenCnt.  Wh
51b0: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
51c0: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
51d0: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
51e0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
51f0: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
5200: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
5210: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
5220: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
5230: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
5240: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5250: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
5260: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
5270: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
5280: 2a 20 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  * The unixOpenCn
5290: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
52a0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
52b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
52c0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
52d0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
52e0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
52f0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
5300: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
5310: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
5320: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
5330: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5340: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5350: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5360: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5370: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5380: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5390: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
53a0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
53b0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
53c0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
53d0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
53e0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
53f0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
5400: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
5410: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
5420: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
5430: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5440: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5450: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5460: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5470: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5480: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5490: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
54a0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
54b0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
54c0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
54d0: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
54e0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
54f0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5500: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5510: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5520: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5530: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5540: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5550: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5560: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5570: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5580: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5590: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
55a0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
55b0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
55c0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
55d0: 42 2e 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f  B..** We have to
55e0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
55f0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5600: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5610: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5620: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f  process..**.** O
5630: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
5640: 74 68 72 65 61 64 20 41 20 69 73 20 75 6e 61 62  thread A is unab
5650: 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63  le to modify loc
5660: 6b 73 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a  ks created by.**
5670: 20 74 68 72 65 61 64 20 42 2c 20 77 65 20 68 61   thread B, we ha
5680: 76 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b  ve to keep track
5690: 20 6f 66 20 77 68 69 63 68 20 74 68 72 65 61 64   of which thread
56a0: 20 63 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a   created each.**
56b0: 20 6c 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68   lock.  Hence th
56c0: 65 72 65 20 69 73 20 61 6e 20 65 78 74 72 61 20  ere is an extra 
56d0: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79  field in the key
56e0: 20 74 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b   to the unixLock
56f0: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
5700: 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73  e to record this
5710: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41   information.  A
5720: 6e 64 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74  nd on those syst
5730: 65 6d 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c  ems it.** is ill
5740: 65 67 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20  egal to begin a 
5750: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f  transaction in o
5760: 6e 65 20 74 68 72 65 61 64 20 61 6e 64 20 66 69  ne thread and fi
5770: 6e 69 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e  nish it.** in an
5780: 6f 74 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73  other.  For this
5790: 20 6c 61 74 74 65 72 20 72 65 73 74 72 69 63 74   latter restrict
57a0: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ion, there is no
57b0: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a   work-around..**
57c0: 20 49 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74   It is a limitat
57d0: 69 6f 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65  ion of LinuxThre
57e0: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ads..*/../*.** S
57f0: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
5800: 75 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65  unixFile.tid fie
5810: 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20  ld.  This field 
5820: 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75  is set when an u
5830: 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69  nixFile.** is fi
5840: 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c  rst opened.  All
5850: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
5860: 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
5870: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
5880: 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20  .** same thread 
5890: 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  is operating on 
58a0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53  the unixFile.  S
58b0: 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
58c0: 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20  stems do.** not 
58d0: 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62  allow locks to b
58e0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
58f0: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e  other threads an
5900: 64 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69  d that restricti
5910: 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  on.** means that
5920: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
5930: 73 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f  se handles canno
5940: 74 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20  t be moved from 
5950: 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f  one thread.** to
5960: 20 61 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c   another while l
5970: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a  ocks are held..*
5980: 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33  *.** Version 3.3
5990: 2e 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a  .1 (2006-01-15):
59a0: 20 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62    unixFile can b
59b0: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65  e moved from one
59c0: 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e   thread to.** an
59d0: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
59e0: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
59f0: 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61 74  on a system that
5a00: 20 73 75 70 70 6f 72 74 73 20 74 68 72 65 61 64   supports thread
5a10: 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20  s.** overriding 
5a20: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
5a30: 73 20 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20  s (which is now 
5a40: 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20  the most common 
5a50: 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20  behavior).** or 
5a60: 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  if no locks are 
5a70: 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75  held.  But the u
5a80: 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69  nixFile.pLock fi
5a90: 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  eld needs to be.
5aa0: 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65  ** recomputed be
5ab0: 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e  cause its key in
5ac0: 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61  cludes the threa
5ad0: 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a  d-id.  See the .
5ae0: 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ** transferOwner
5af0: 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  ship() function 
5b00: 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
5b10: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5b20: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
5b30: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
5b40: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
5b50: 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52  # define SET_THR
5b60: 45 41 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e  EADID(X)   (X)->
5b70: 74 69 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65  tid = pthread_se
5b80: 6c 66 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48  lf().# define CH
5b90: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
5ba0: 28 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65  (threadsOverride
5bb0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d  EachOthersLocks=
5bc0: 3d 30 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  =0 && \.        
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 21 70 74 68 72 65 61 64 5f 65 71 75      !pthread_equ
5bf0: 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68  al((X)->tid, pth
5c00: 72 65 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65  read_self())).#e
5c10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54  lse.# define SET
5c20: 5f 54 48 52 45 41 44 49 44 28 58 29 0a 23 20 64  _THREADID(X).# d
5c30: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
5c40: 41 44 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66  ADID(X) 0.#endif
5c50: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
5c60: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
5c70: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
5c80: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
5c90: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
5ca0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
5cb0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
5cc0: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
5cd0: 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20  inode.  This.** 
5ce0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
5cf0: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65  he unixLockKey e
5d00: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
5d10: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
5d20: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ted..*/.struct u
5d30: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
5d40: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
5d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
5d60: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
5d70: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
5d80: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5d90: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
5da0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
5db0: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
5dc0: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
5df0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
5e00: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
5e10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5e20: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
5e30: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
5e40: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
5e50: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
5e60: 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74  xLockInfo struct
5e70: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
5e80: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
5e90: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
5ea0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
5eb0: 73 20 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68  s locks (LinuxTh
5ec0: 72 65 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a  reads), then we.
5ed0: 2a 2a 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c  ** set the unixL
5ee0: 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64  ockKey.tid field
5ef0: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49   to the thread I
5f00: 44 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63  D.  If threads c
5f10: 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65  an override.** e
5f20: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
5f30: 20 28 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c   (Posix and NPTL
5f40: 29 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c  ) then tid is al
5f50: 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
5f60: 2e 0a 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74  ..** tid is omit
5f70: 74 65 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c  ted if we compil
5f80: 65 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64  e without thread
5f90: 69 6e 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f  ing support or o
5fa0: 6e 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72  n an OS.** other
5fb0: 20 74 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a   than linux..*/.
5fc0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b  struct unixLockK
5fd0: 65 79 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  ey {.  struct un
5fe0: 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f  ixFileId fid;  /
5ff0: 2a 20 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66  * Unique identif
6000: 69 65 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ier for the file
6010: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54   */.#if SQLITE_T
6020: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
6030: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
6040: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
6050: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
6060: 66 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65  f lock owner. Ze
6070: 72 6f 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20  ro if not using 
6080: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a  LinuxThreads */.
6090: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
60a0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
60b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
60c0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
60d0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
60e0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
60f0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
6100: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
6110: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
6120: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
6130: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
6140: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
6150: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
6160: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
6170: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
6180: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
6190: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
61a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
61b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
61c0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
61d0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
61e0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
61f0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
6200: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
6210: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6220: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  */.struct unixLo
6230: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
6240: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f  t unixLockKey lo
6250: 63 6b 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68  ckKey;     /* Th
6260: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
6270: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
62a0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
62b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79   */.  int lockty
62c0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
62d0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
62e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
62f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
6300: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6330: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6340: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6350: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
6360: 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  kInfo *pNext;   
6370: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
6380: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62   unixLockInfo ob
6390: 6a 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  jects */.  struc
63a0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
63b0: 70 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20  pPrev;     /*   
63c0: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
63d0: 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ked */.};../*.**
63e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
63f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
6400: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
6410: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
6420: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
6430: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
6440: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
6450: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
6460: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
6470: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
6480: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
6490: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
64a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
64b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
64c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
64d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
64e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
64f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6500: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
6510: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
6520: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ist..**.** TODO:
6530: 20 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67    Consider chang
6540: 69 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61 74  ing this so that
6550: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
6560: 20 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20   single file.** 
6570: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65  descriptor for e
6580: 61 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65  ach open file, e
6590: 76 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f  ven when it is o
65a0: 70 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  pened multiple t
65b0: 69 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f  imes..** The clo
65c0: 73 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  se() system call
65d0: 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75   would only occu
65e0: 72 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  r when the last 
65f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e  database.** usin
6600: 67 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65  g the file close
6610: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
6620: 78 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72  xOpenCnt {.  str
6630: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
6640: 69 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20  ileId;   /* The 
6650: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
6660: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6680: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6690: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
66a0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ure */.  int nLo
66b0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
66c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
66d0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
66e0: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
66f0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20  nding;          
6700: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6710: 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28  f pending close(
6720: 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  ) operations */.
6730: 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b    int *aPending;
6740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6750: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f  alloced space ho
6760: 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61 69 74  lding fd's await
6770: 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f  ing a close() */
6780: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6790: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
67c0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
67d0: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
67e0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
67f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
6800: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
6810: 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 75  endif.  struct u
6820: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4e 65 78  nixOpenCnt *pNex
6830: 74 2c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  t, *pPrev;   /* 
6840: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
6850: 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 20  OpenCnt objects 
6860: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73  */.};../*.** Lis
6870: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f  ts of all unixLo
6880: 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f  ckInfo and unixO
6890: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 2e 20  penCnt objects. 
68a0: 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 20 62   These used to b
68b0: 65 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65 73  e hash.** tables
68c0: 2e 20 20 42 75 74 20 74 68 65 20 6e 75 6d 62 65  .  But the numbe
68d0: 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 69 73 20  r of objects is 
68e0: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
68f0: 20 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20   a dozen and.** 
6900: 6e 65 76 65 72 20 65 78 63 65 65 64 73 20 61 20  never exceeds a 
6910: 66 65 77 20 74 68 6f 75 73 61 6e 64 2e 20 20 41  few thousand.  A
6920: 6e 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f 74  nd lookup is not
6930: 20 6f 6e 20 61 20 63 72 69 74 69 63 61 6c 0a 2a   on a critical.*
6940: 2a 20 70 61 74 68 20 73 6f 20 61 20 73 69 6d 70  * path so a simp
6950: 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77  le linked list w
6960: 69 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a 2f 0a  ill suffice..*/.
6970: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e  static struct un
6980: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b  ixLockInfo *lock
6990: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
69a0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
69b0: 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20  Cnt *openList = 
69c0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  0;../*.** This v
69d0: 61 72 69 61 62 6c 65 20 72 65 6d 65 6d 62 65 72  ariable remember
69e0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
69f0: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
6a00: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6a10: 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  s.** locks..**.*
6a20: 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68  *    0:  No.  Th
6a30: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
6a40: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6a50: 73 20 6c 6f 63 6b 73 2e 20 20 28 4c 69 6e 75 78  s locks.  (Linux
6a60: 54 68 72 65 61 64 73 29 0a 2a 2a 20 20 20 20 31  Threads).**    1
6a70: 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73  :  Yes.  Threads
6a80: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6a90: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6aa0: 20 20 28 50 6f 73 69 78 20 26 20 4e 4c 50 54 29    (Posix & NLPT)
6ab0: 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f  .**   -1:  We do
6ac0: 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a  n't know yet..**
6ad0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  .** On some syst
6ae0: 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20  ems, we know at 
6af0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20  compile-time if 
6b00: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
6b10: 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68  ride each.** oth
6b20: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74  ers locks.  On t
6b30: 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68  hose systems, th
6b40: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
6b50: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61  OVERRIDE_LOCK ma
6b60: 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  cro.** will be s
6b70: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
6b80: 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74  .  On other syst
6b90: 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ems, we have to 
6ba0: 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74  check at.** runt
6bb0: 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c  ime.  On these l
6bc0: 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53  atter systems, S
6bd0: 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLTIE_THREAD_OVE
6be0: 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a  RRIDE_LOCK is.**
6bf0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
6c00: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
6c10: 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c  normally has fil
6c20: 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42  e scope only.  B
6c30: 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ut during testin
6c40: 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74  g, we make.** it
6c50: 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61   a global so tha
6c60: 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20  t the test code 
6c70: 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76  can change its v
6c80: 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  alue in order to
6c90: 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20   verify.** that 
6ca0: 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20  the right stuff 
6cb0: 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65  happens in eithe
6cc0: 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 53  r case..*/.#if S
6cd0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6ce0: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
6cf0: 6e 75 78 5f 5f 29 0a 23 20 20 69 66 6e 64 65 66  nux__).#  ifndef
6d00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6d10: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 20  VERRIDE_LOCK.#  
6d20: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
6d30: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
6d40: 4c 4f 43 4b 20 2d 31 0a 23 20 20 65 6e 64 69 66  LOCK -1.#  endif
6d50: 0a 23 20 20 69 66 64 65 66 20 53 51 4c 49 54 45  .#  ifdef SQLITE
6d60: 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64  _TEST.int thread
6d70: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
6d80: 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54  ersLocks = SQLIT
6d90: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6da0: 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6c 73 65 0a  E_LOCK;.#  else.
6db0: 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65 61  static int threa
6dc0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
6dd0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49  hersLocks = SQLI
6de0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
6df0: 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6e 64 69  DE_LOCK;.#  endi
6e00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
6e10: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  This structure h
6e20: 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  olds information
6e30: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64   passed into ind
6e40: 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20  ividual test.** 
6e50: 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74  threads by the t
6e60: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
6e70: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
6e80: 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68  ne..*/.struct th
6e90: 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20  readTestData {. 
6ea0: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
6eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
6ec0: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
6ed0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
6ee0: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ock;     /* The 
6ef0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
6f00: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  n */.  int resul
6f10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6f20: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c   Result of the l
6f30: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
6f40: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c 49   */.};..#if SQLI
6f50: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
6f60: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
6f70: 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  __)./*.** This f
6f80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
6f90: 61 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74  as the main rout
6fa0: 69 6e 65 20 66 6f 72 20 61 20 74 68 72 65 61 64  ine for a thread
6fb0: 20 6c 61 75 6e 63 68 65 64 20 62 79 0a 2a 2a 20   launched by.** 
6fc0: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
6fd0: 67 42 65 68 61 76 69 6f 72 28 29 2e 20 49 74 20  gBehavior(). It 
6fe0: 74 65 73 74 73 20 77 68 65 74 68 65 72 20 74 68  tests whether th
6ff0: 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 62  e shared-lock ob
7000: 74 61 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  tained.** by the
7010: 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 20   main thread in 
7020: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
7030: 67 42 65 68 61 76 69 6f 72 28 29 20 63 6f 6e 66  gBehavior() conf
7040: 6c 69 63 74 73 20 77 69 74 68 20 61 0a 2a 2a 20  licts with a.** 
7050: 68 79 70 6f 74 68 65 74 69 63 61 6c 20 77 72 69  hypothetical wri
7060: 74 65 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64  te-lock obtained
7070: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
7080: 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
7090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74  ..**.** The writ
70a0: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63  e-lock is not ac
70b0: 74 75 61 6c 6c 79 20 61 63 71 75 69 72 65 64 2c  tually acquired,
70c0: 20 61 73 20 74 68 69 73 20 69 73 20 6e 6f 74 20   as this is not 
70d0: 70 6f 73 73 69 62 6c 65 20 69 66 20 0a 2a 2a 20  possible if .** 
70e0: 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  the file is open
70f0: 20 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f   in read-only mo
7100: 64 65 20 28 73 65 65 20 74 69 63 6b 65 74 20 23  de (see ticket #
7110: 33 34 37 32 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  3472)..*/ .stati
7120: 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f  c void *threadLo
7130: 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a  ckingTest(void *
7140: 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20  pArg){.  struct 
7150: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a  threadTestData *
7160: 70 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20  pData = (struct 
7170: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29  threadTestData*)
7180: 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72  pArg;.  pData->r
7190: 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44  esult = fcntl(pD
71a0: 61 74 61 2d 3e 66 64 2c 20 46 5f 47 45 54 4c 4b  ata->fd, F_GETLK
71b0: 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b  , &pData->lock);
71c0: 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a  .  return pArg;.
71d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
71e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
71f0: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
7200: 5f 5f 29 20 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c  __) */...#if SQL
7210: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
7220: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
7230: 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  x__)./*.** This 
7240: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
7250: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
7260: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7270: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
7280: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
7290: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
72a0: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
72b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
72c0: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
72d0: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
72e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
72f0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
7300: 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66  ngBehavior(int f
7310: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
7320: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  d;.  int rc;.  s
7330: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
7340: 44 61 74 61 20 64 3b 0a 20 20 73 74 72 75 63 74  Data d;.  struct
7350: 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70 74 68 72   flock l;.  pthr
7360: 65 61 64 5f 74 20 74 3b 0a 0a 20 20 66 64 20 3d  ead_t t;..  fd =
7370: 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20   dup(fd_orig);. 
7380: 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74 75   if( fd<0 ) retu
7390: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6c 2c  rn;.  memset(&l,
73a0: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 29 29 3b 0a   0, sizeof(l));.
73b0: 20 20 6c 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52    l.l_type = F_R
73c0: 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20  DLCK;.  l.l_len 
73d0: 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72 74  = 1;.  l.l_start
73e0: 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e   = 0;.  l.l_when
73f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
7400: 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 5f 6f   rc = fcntl(fd_o
7410: 72 69 67 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  rig, F_SETLK, &l
7420: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
7430: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
7440: 74 28 26 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&d, 0, sizeof(
7450: 64 29 29 3b 0a 20 20 64 2e 66 64 20 3d 20 66 64  d));.  d.fd = fd
7460: 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a  ;.  d.lock = l;.
7470: 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20    d.lock.l_type 
7480: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68  = F_WRLCK;.  pth
7490: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20  read_create(&t, 
74a0: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
74b0: 54 65 73 74 2c 20 26 64 29 3b 0a 20 20 70 74 68  Test, &d);.  pth
74c0: 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b  read_join(t, 0);
74d0: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
74e0: 69 66 28 20 64 2e 72 65 73 75 6c 74 21 3d 30 20  if( d.result!=0 
74f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 74 68 72 65  ) return;.  thre
7500: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
7510: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e  thersLocks = (d.
7520: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  lock.l_type==F_U
7530: 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  NLCK);.}.#endif 
7540: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 45 52 41 44  /* SQLITE_THERAD
7550: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7560: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 2f  __linux__) */../
7570: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
7580: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
7590: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
75a0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
75b0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f  ndLockInfo()..*/
75c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
75d0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72  easeLockInfo(str
75e0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
75f0: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20   *pLock){.  if( 
7600: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
7610: 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ck->nRef--;.    
7620: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
7630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7640: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a  pLock->pPrev ){.
7650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7660: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e  pLock->pPrev->pN
7670: 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20  ext==pLock );.  
7680: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72        pLock->pPr
7690: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63  ev->pNext = pLoc
76a0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
76b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
76c0: 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d  ssert( lockList=
76d0: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
76e0: 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f    lockList = pLo
76f0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
7700: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
7710: 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ck->pNext ){.   
7720: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
7730: 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ck->pNext->pPrev
7740: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
7750: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d     pLock->pNext-
7760: 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e  >pPrev = pLock->
7770: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
7780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7790: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  e(pLock);.    }.
77a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
77b0: 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43  ease a unixOpenC
77c0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
77d0: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
77e0: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
77f0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
7800: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
7810: 6e 74 28 73 74 72 75 63 74 20 75 6e 69 78 4f 70  nt(struct unixOp
7820: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
7830: 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20   if( pOpen ){.  
7840: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
7850: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
7860: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
7870: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65   if( pOpen->pPre
7880: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
7890: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65  ert( pOpen->pPre
78a0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70 65 6e 20  v->pNext==pOpen 
78b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  );.        pOpen
78c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
78d0: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20   pOpen->pNext;. 
78e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
78f0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 65 6e      assert( open
7900: 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20  List==pOpen );. 
7910: 20 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20         openList 
7920: 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a  = pOpen->pNext;.
7930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7940: 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 29  ( pOpen->pNext )
7950: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7960: 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e  ( pOpen->pNext->
7970: 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a  pPrev==pOpen );.
7980: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70          pOpen->p
7990: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f  Next->pPrev = pO
79a0: 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  pen->pPrev;.    
79b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
79c0: 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50  3_free(pOpen->aP
79d0: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 73  ending);.      s
79e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
79f0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  n);.    }.  }.}.
7a00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
7a10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
7a20: 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49  locate unixLockI
7a30: 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e  nfo and unixOpen
7a40: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74  Cnt structures t
7a50: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
7a60: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
7a70: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e  iptor.  Create n
7a80: 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73  ew ones if neces
7a90: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
7aa0: 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68  turn values migh
7ab0: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
7ac0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
7ad0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ccurs..**.** Ret
7ae0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
7af0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
7b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
7b10: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69  dLockInfo(.  uni
7b20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
7b40: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
7b50: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
7b60: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  the key */.  str
7b70: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
7b80: 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52   **ppLock,  /* R
7b90: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f  eturn the unixLo
7ba0: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
7bb0: 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
7bc0: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a  t unixOpenCnt **
7bd0: 70 70 4f 70 65 6e 20 20 20 20 2f 2a 20 52 65 74  ppOpen    /* Ret
7be0: 75 72 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e  urn the unixOpen
7bf0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
7c10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
7c30: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
7c40: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
7c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7c70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7c80: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
7c90: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65  truct unixLockKe
7ca0: 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a  y lockKey;    /*
7cb0: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
7cc0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  the unixLockInfo
7cd0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7ce0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
7cf0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
7d00: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
7d10: 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74   the unixOpenCnt
7d20: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 74 72   struct */.  str
7d30: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
7d40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
7d50: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
7d60: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  formation */.  s
7d70: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7d80: 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 2f 2a  fo *pLock;    /*
7d90: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4c   Candidate unixL
7da0: 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  ockInfo object *
7db0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  /.  struct unixO
7dc0: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20  penCnt *pOpen;  
7dd0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
7de0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65  unixOpenCnt obje
7df0: 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 74 20  ct */..  /* Get 
7e00: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
7e10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
7e20: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
7e30: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
7e40: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
7e50: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
7e60: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
7e70: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73  le->h;.  rc = fs
7e80: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
7e90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
7ea0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
7eb0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7ec0: 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57  #ifdef EOVERFLOW
7ed0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
7ee0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
7ef0: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
7f00: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
7f10: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
7f20: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
7f30: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
7f40: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
7f50: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
7f60: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
7f70: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
7f80: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
7f90: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
7fa0: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
7fb0: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
7fc0: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
7fd0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
7fe0: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
7ff0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
8000: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
8010: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
8020: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
8030: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
8040: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
8050: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
8060: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
8070: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
8080: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
8090: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
80a0: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
80b0: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
80c0: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
80d0: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
80e0: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
80f0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
8100: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
8110: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
8120: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
8130: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
8140: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
8150: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
8160: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
8170: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
8180: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
8190: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
81a0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
81b0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ize==0 ){.    rc
81c0: 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22   = write(fd, "S"
81d0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
81e0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
81f0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
8210: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
8220: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
8230: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
8240: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
8250: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
8260: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
8280: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f  if..  memset(&lo
8290: 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66  ckKey, 0, sizeof
82a0: 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f  (lockKey));.  lo
82b0: 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76 20 3d 20  ckKey.fid.dev = 
82c0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
82d0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
82e0: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64   lockKey.fid.pId
82f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
8300: 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  else.  lockKey.f
8310: 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  id.ino = statbuf
8320: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
8330: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
8340: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
8350: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66  (__linux__).  if
8360: 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  ( threadsOverrid
8370: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
8380: 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68  <0 ){.    testTh
8390: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
83a0: 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c  ior(fd);.  }.  l
83b0: 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20 74 68 72  ockKey.tid = thr
83c0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
83d0: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
83e0: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
83f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69 6c 65 49  ;.#endif.  fileI
8400: 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b  d = lockKey.fid;
8410: 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30  .  if( ppLock!=0
8420: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
8430: 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68  lockList;.    wh
8440: 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65  ile( pLock && me
8450: 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26  mcmp(&lockKey, &
8460: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20  pLock->lockKey, 
8470: 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29  sizeof(lockKey))
8480: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
8490: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
84a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
84b0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
84c0: 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  pLock = sqlite3_
84d0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
84e0: 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 20 20  pLock) );.      
84f0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
8500: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
8510: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
8520: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
8530: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20  dlockinfo;.     
8540: 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e   }.      pLock->
8550: 6c 6f 63 6b 4b 65 79 20 3d 20 6c 6f 63 6b 4b 65  lockKey = lockKe
8560: 79 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  y;.      pLock->
8570: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
8580: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a  pLock->cnt = 0;.
8590: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
85a0: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  ktype = 0;.     
85b0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
85c0: 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20  lockList;.      
85d0: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30  pLock->pPrev = 0
85e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b  ;.      if( lock
85f0: 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d  List ) lockList-
8600: 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a  >pPrev = pLock;.
8610: 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d        lockList =
8620: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73   pLock;.    }els
8630: 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  e{.      pLock->
8640: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8650: 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63    *ppLock = pLoc
8660: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 4f  k;.  }.  if( ppO
8670: 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f  pen!=0 ){.    pO
8680: 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a  pen = openList;.
8690: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e      while( pOpen
86a0: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
86b0: 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65  Id, &pOpen->file
86c0: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
86d0: 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  d)) ){.      pOp
86e0: 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  en = pOpen->pNex
86f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
8700: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
8710: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
8720: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8730: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
8740: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
8750: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
8760: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
8770: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
8780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8790: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
87a0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
87b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
87c0: 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65  n->fileId = file
87d0: 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  Id;.      pOpen-
87e0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
87f0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20   pOpen->nLock = 
8800: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
8810: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
8820: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
8830: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
8840: 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70  Open->pNext = op
8850: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4f  enList;.      pO
8860: 70 65 6e 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  pen->pPrev = 0;.
8870: 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69        if( openLi
8880: 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70  st ) openList->p
8890: 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Prev = pOpen;.  
88a0: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
88b0: 4f 70 65 6e 3b 0a 23 69 66 20 4f 53 5f 56 58 57  Open;.#if OS_VXW
88c0: 4f 52 4b 53 0a 20 20 20 20 20 20 70 4f 70 65 6e  ORKS.      pOpen
88d0: 2d 3e 70 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20  ->pSem = NULL;. 
88e0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d       pOpen->aSem
88f0: 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
8900: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
8910: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  {.      pOpen->n
8920: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
8930: 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e   *ppOpen = pOpen
8940: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64  ;.  }..exit_find
8950: 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75  lockinfo:.  retu
8960: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8970: 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  If we are curren
8980: 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65  tly in a differe
8990: 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74  nt thread than t
89a0: 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74  he thread that t
89b0: 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61  he.** unixFile a
89c0: 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20  rgument belongs 
89d0: 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  to, then transfe
89e0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  r ownership of t
89f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f  he unixFile.** o
8a00: 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65  ver to the curre
8a10: 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  nt thread..**.**
8a20: 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f   A unixFile is o
8a30: 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74  nly owned by a t
8a40: 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73  hread on systems
8a50: 20 74 68 61 74 20 75 73 65 20 4c 69 6e 75 78 54   that use LinuxT
8a60: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77  hreads..**.** Ow
8a70: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
8a80: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
8a90: 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   if the unixFile
8aa0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
8ab0: 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68  locked..** If th
8ac0: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f  e unixFile is lo
8ad0: 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65  cked and an owne
8ae0: 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20  rship is wrong, 
8af0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53  then return.** S
8b00: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53  QLITE_MISUSE.  S
8b10: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
8b20: 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
8b30: 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66  ng works..*/.#if
8b40: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8b50: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8b60: 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74 69 63 20  linux__).static 
8b70: 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  int transferOwne
8b80: 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a  rship(unixFile *
8b90: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
8ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53  ;.  pthread_t hS
8bb0: 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61  elf;.  if( threa
8bc0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
8bd0: 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20  hersLocks ){.   
8be0: 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72   /* Ownership tr
8bf0: 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64  ansfers not need
8c00: 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65  ed on this syste
8c10: 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  m */.    return 
8c20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8c30: 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64   hSelf = pthread
8c40: 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70  _self();.  if( p
8c50: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69  thread_equal(pFi
8c60: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20  le->tid, hSelf) 
8c70: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
8c80: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61   still in the sa
8c90: 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20  me thread */.   
8ca0: 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72   OSTRACE1("No-tr
8cb0: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
8cc0: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
8cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8ce0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
8cf0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
8d00: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
8d10: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
8d20: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
8d30: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
8d40: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
8d50: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
8d60: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
8d70: 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73  "Transfer owners
8d80: 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25  hip of %d from %
8d90: 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d to %d\n",.    
8da0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
8db0: 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  , pFile->tid, hS
8dc0: 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74  elf);.  pFile->t
8dd0: 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66  id = hSelf;.  if
8de0: 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21   (pFile->pLock !
8df0: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65  = NULL) {.    re
8e00: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
8e10: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
8e20: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
8e30: 66 6f 28 70 46 69 6c 65 2c 20 26 70 46 69 6c 65  fo(pFile, &pFile
8e40: 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20  ->pLock, 0);.   
8e50: 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20   OSTRACE5("LOCK 
8e60: 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28     %d is now %s(
8e70: 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  %s,%d)\n", pFile
8e80: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
8e90: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
8ea0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
8eb0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
8ec0: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c  peName(pFile->pL
8ed0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
8ee0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  pFile->pLock->cn
8ef0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  t);.    return r
8f00: 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
8f10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f20: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20  OK;.  }.}.#else 
8f30: 20 2f 2a 20 69 66 20 6e 6f 74 20 53 51 4c 49 54   /* if not SQLIT
8f40: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
8f50: 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74    /* On single-t
8f60: 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20  hreaded builds, 
8f70: 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  ownership transf
8f80: 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f  er is a no-op */
8f90: 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66  .# define transf
8fa0: 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53  erOwnership(X) S
8fb0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20  QLITE_OK.#endif 
8fc0: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  /* SQLITE_THREAD
8fd0: 53 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  SAFE */.../*.** 
8fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
8ff0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
9000: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9010: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
9020: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
9030: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
9040: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
9050: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
9060: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
9070: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
9080: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
9090: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
90a0: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
90b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
90c0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
90d0: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
90e0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
90f0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
9100: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
9110: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
9120: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
9130: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
9140: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
9150: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9160: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
9170: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
9180: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
9190: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
91a0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
91b0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
91c0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
91d0: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
91e0: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
91f0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
9200: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
9210: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
9220: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
9230: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
9240: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
9250: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
9260: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
9270: 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if( pFile->pLock
9280: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
9290: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
92a0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
92b0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
92c0: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
92d0: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
92e0: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
92f0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
9300: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
9310: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
9320: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
9330: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
9340: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
9350: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
9360: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
9370: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
9380: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
9390: 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20 3d  CK;.    if (-1 =
93a0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
93b0: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
93c0: 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  )) {.      int t
93d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
93e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
93f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9400: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9410: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
9420: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
9430: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9440: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
9450: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63    } else if( loc
9460: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
9470: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72  K ){.      reser
9480: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
9490: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75   }.#endif.  .  u
94a0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
94b0: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
94c0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
94d0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
94e0: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
94f0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
9500: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
9510: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
9520: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
9530: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
9540: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
9550: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
9560: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
9570: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
9580: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
9590: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
95a0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
95b0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
95c0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
95d0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
95e0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
95f0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
9600: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
9610: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
9620: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
9630: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
9640: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
9650: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
9660: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
9670: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
9680: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
9690: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
96a0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
96b0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
96c0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
96d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
96e0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
96f0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
9700: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
9710: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
9720: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
9730: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
9740: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
9750: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
9760: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
9770: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
9780: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
9790: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
97a0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
97b0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
97c0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
97d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
97e0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
97f0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
9800: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
9810: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
9820: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
9830: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
9840: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
9850: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9860: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
9870: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
9880: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
9890: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
98a0: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
98b0: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
98c0: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
98d0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
98e0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
98f0: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
9900: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
9910: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
9920: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
9930: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
9940: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
9950: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
9960: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
9970: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
9980: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
9990: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
99a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
99b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
99c0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
99d0: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
99e0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
99f0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
9a00: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
9a10: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
9a20: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
9a30: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
9a40: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
9a50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9a60: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
9a70: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
9a80: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
9a90: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
9aa0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
9ab0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9ac0: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
9ad0: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
9ae0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
9af0: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
9b00: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
9b10: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
9b20: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
9b30: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
9b40: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
9b50: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
9b60: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
9b70: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
9b80: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9b90: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
9ba0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
9bb0: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
9bc0: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
9bd0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
9be0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
9bf0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
9c00: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
9c10: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
9c20: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
9c30: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
9c40: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
9c50: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
9c60: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
9c70: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
9c80: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
9c90: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
9ca0: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
9cb0: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
9cc0: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
9cd0: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
9ce0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
9cf0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
9d00: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
9d10: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
9d20: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
9d30: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
9d40: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
9d50: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
9d60: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
9d70: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
9d80: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
9d90: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
9da0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
9db0: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
9dc0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
9dd0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
9de0: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
9df0: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
9e00: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
9e10: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
9e20: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
9e30: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
9e40: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
9e50: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
9e60: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
9e70: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
9e80: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9e90: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
9ea0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
9eb0: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
9ec0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
9ed0: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
9ee0: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
9ef0: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
9f00: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
9f10: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
9f20: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
9f30: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
9f40: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
9f50: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
9f60: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
9f70: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
9f80: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
9f90: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
9fa0: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
9fb0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9fc0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9fd0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
9fe0: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
9ff0: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
a000: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
a010: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
a020: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
a030: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
a040: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
a050: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
a060: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
a070: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
a080: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
a090: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
a0a0: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
a0b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a0c0: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
a0d0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
a0e0: 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75  *)id;.  struct u
a0f0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
a100: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
a110: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
a120: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
a130: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a140: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
a150: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
a160: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
a170: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
a180: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
a190: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
a1a0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
a1b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
a1c0: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
a1d0: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
a1e0: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
a1f0: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
a200: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
a210: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
a220: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
a230: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
a240: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
a250: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
a260: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
a270: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
a280: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
a290: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
a2a0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
a2b0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
a2c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
a2d0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
a2e0: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
a2f0: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
a300: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
a310: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
a320: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
a330: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
a340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a350: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
a360: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
a370: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
a380: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
a390: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
a3a0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
a3b0: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
a3c0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
a3d0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
a3e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
a3f0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
a400: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
a410: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
a420: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a430: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
a440: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
a450: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
a460: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
a470: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
a480: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
a490: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
a4a0: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
a4b0: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
a4c0: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
a4d0: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
a4e0: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
a4f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a500: 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
a510: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
a520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a530: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
a540: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
a550: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
a560: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
a570: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
a580: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
a590: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
a5a0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
a5b0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
a5c0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
a5d0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c  .  if( (pFile->l
a5e0: 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e  ocktype!=pLock->
a5f0: 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20  locktype && .   
a600: 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c         (pLock->l
a610: 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  ocktype>=PENDING
a620: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
a630: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  e>SHARED_LOCK)).
a640: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a650: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
a660: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a670: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
a680: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
a690: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
a6a0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
a6b0: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
a6c0: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
a6d0: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
a6e0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
a6f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
a700: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
a710: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
a720: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
a730: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
a740: 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e   .      (pLock->
a750: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a760: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
a770: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
a780: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
a790: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a7a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
a7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
a7c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  le->locktype==0 
a7d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a7e0: 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20  Lock->cnt>0 );. 
a7f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a800: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a810: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ;.    pLock->cnt
a820: 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  ++;.    pFile->p
a830: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a840: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a850: 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  ;.  }..  lock.l_
a860: 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63  len = 1L;..  loc
a870: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a880: 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50  K_SET;..  /* A P
a890: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
a8a0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
a8b0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
a8c0: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
a8d0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
a8e0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
a8f0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
a900: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
a910: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
a920: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
a930: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
a940: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
a950: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
a960: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a970: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
a980: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
a990: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
a9a0: 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70  _type = (locktyp
a9b0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  e==SHARED_LOCK?F
a9c0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
a9d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a9e0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
a9f0: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
aa00: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
aa10: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
aa20: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
aa30: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
aa40: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
aa50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
aa60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
aa70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
aa80: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
aa90: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
aaa0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
aab0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
aac0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
aad0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
aae0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
aaf0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
ab00: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
ab10: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
ab20: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
ab30: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
ab40: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
ab50: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
ab60: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
ab70: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ab80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ab90: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
aba0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
abb0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
abc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
abd0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
abe0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
abf0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
ac00: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
ac10: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ac20: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
ac30: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
ac40: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
ac50: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
ac60: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
ac70: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ac80: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac90: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
aca0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
acb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
acc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
acd0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
ace0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
acf0: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
ad00: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ad10: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
ad20: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
ad30: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
ad40: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
ad50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
ad60: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
ad70: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
ad80: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
ad90: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ada0: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
adb0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
adc0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
add0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ade0: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
adf0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ae00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ae10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ae20: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ae30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae40: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
ae50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ae60: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
ae70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ae80: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
ae90: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
aea0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
aeb0: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
aec0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
aed0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aee0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aef0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
af00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
af10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
af20: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
af30: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
af40: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
af50: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
af60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
af70: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
af80: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
af90: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
afa0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
afb0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
afc0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
afd0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
afe0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
aff0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
b000: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
b010: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
b020: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
b030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
b040: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
b050: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
b060: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
b070: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
b080: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
b090: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
b0a0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
b0b0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
b0c0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
b0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
b0e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b0f0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
b100: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
b110: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
b120: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
b130: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
b140: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
b150: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
b160: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
b170: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b180: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
b190: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
b1a0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
b1b0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
b1c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
b1d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
b1f0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
b200: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
b210: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
b220: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b230: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
b240: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b250: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
b260: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
b270: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b280: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b290: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
b2a0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
b2b0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
b2d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b2e0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
b2f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
b300: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
b310: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
b320: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
b330: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
b340: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
b350: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
b360: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
b370: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
b380: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
b390: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
b3a0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
b3b0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
b3c0: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
b3d0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
b3e0: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
b3f0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
b400: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b410: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
b420: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ->locktype<=SHAR
b430: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 6c 6f  ED_LOCK.   && lo
b440: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
b450: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
b460: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
b470: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
b480: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
b490: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
b4a0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
b4b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
b4c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b4d0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
b4e0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b4f0: 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  pe;.    pLock->l
b500: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
b510: 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pe;.  }else if( 
b520: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
b530: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
b540: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b550: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
b560: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
b570: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
b580: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
b590: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
b5a0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
b5b0: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
b5c0: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
b5d0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
b5e0: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
b5f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
b600: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
b610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
b620: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
b630: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
b640: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
b650: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
b660: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
b670: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
b680: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
b690: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
b6a0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
b6b0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
b6c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
b6d0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
b6e0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
b6f0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
b700: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
b710: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
b720: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
b730: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
b740: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
b750: 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20  type){.  struct 
b760: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
b770: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
b780: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
b790: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b7a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b7b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b7c0: 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  d;.  int h;..  a
b7d0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b7e0: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
b7f0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
b800: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
b810: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
b820: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
b830: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
b840: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
b850: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
b860: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
b870: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
b880: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
b890: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
b8a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
b8b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
b8c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b8d0: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
b8e0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
b8f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b900: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
b910: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
b920: 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c  ex();.  h = pFil
b930: 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20  e->h;.  pLock = 
b940: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
b950: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
b960: 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
b970: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
b980: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
b990: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b9a0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65  >locktype==pFile
b9b0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
b9c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b9d0: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
b9e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
b9f0: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
ba00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
ba10: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
ba20: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
ba30: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
ba40: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
ba50: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
ba60: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
ba70: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
ba80: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
ba90: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
baa0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
bab0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
bac0: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
bad0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
bae0: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
baf0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
bb00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
bb10: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
bb20: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
bb30: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
bb40: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
bb50: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
bb60: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
bb70: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
bb80: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
bb90: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
bba0: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
bbb0: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
bbc0: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
bbd0: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
bbe0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
bbf0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
bc00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
bc10: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
bc20: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
bc30: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
bc40: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
bc50: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
bc60: 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
bc70: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
bc80: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20   0;.#endif...   
bc90: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
bca0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
bcb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
bcc0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
bcd0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bce0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
bcf0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bd00: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bd10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bd20: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
bd30: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
bd40: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bd50: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bd60: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
bd70: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
bd80: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bd90: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
bda0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
bdb0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
bdc0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bdd0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bde0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bdf0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
be00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
be10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
be20: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
be30: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
be40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
be50: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
be60: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
be70: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
be80: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
be90: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
bea0: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
beb0: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
bec0: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
bed0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
bee0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
bef0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  ) ){.      pLock
bf00: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
bf10: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
bf20: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  lse{.      int t
bf30: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
bf40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bf50: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
bf60: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
bf70: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
bf80: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
bf90: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
bfa0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
bfb0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
bfc0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
bfd0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
bfe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
bff0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
c000: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75  LOCK ){.    stru
c010: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
c020: 70 4f 70 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72  pOpen;.    int r
c030: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
c040: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
c050: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
c060: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
c070: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
c080: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
c090: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
c0a0: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
c0b0: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
c0c0: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
c0d0: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
c0e0: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
c0f0: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
c100: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
c110: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c120: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
c130: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c140: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c150: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c160: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
c170: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
c180: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
c190: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
c1a0: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
c1b0: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
c1c0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
c1d0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0);.      if( fc
c1e0: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
c1f0: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
c200: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
c210: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
c220: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
c230: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
c240: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
c260: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
c270: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
c280: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
c290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
c2a0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
c2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
c2c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c2d0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
c2e0: 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  .        pLock->
c2f0: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
c300: 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
c310: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
c320: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
c330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
c340: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
c350: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
c360: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
c370: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
c380: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
c390: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
c3a0: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
c3b0: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
c3c0: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
c3d0: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
c3e0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
c3f0: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
c400: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
c410: 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e  pOpen;.    pOpen
c420: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
c430: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c  ssert( pOpen->nL
c440: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
c450: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
c460: 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
c470: 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
c480: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
c490: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
c4a0: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
c4b0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 20         /* close 
c4c0: 70 65 6e 64 69 6e 67 20 66 64 73 2c 20 62 75 74  pending fds, but
c4d0: 20 69 66 20 63 6c 6f 73 69 6e 67 20 66 61 69 6c   if closing fail
c4e0: 73 20 64 6f 6e 27 74 20 66 72 65 65 20 74 68 65  s don't free the
c4f0: 20 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 2a   array.        *
c500: 2a 20 61 73 73 69 67 6e 20 2d 31 20 74 6f 20 74  * assign -1 to t
c510: 68 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  he successfully 
c520: 63 6c 6f 73 65 64 20 64 65 73 63 72 69 70 74 6f  closed descripto
c530: 72 73 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  rs and record th
c540: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  e.        ** err
c550: 6f 72 2e 20 20 54 68 65 20 6e 65 78 74 20 61 74  or.  The next at
c560: 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f 63 6b 20  tempt to unlock 
c570: 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e 2e 20  will try again. 
c580: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
c590: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
c5a0: 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e 75 65  ] < 0 ) continue
c5b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6c  ;.        if( cl
c5c0: 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ose(pOpen->aPend
c5d0: 69 6e 67 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  ing[i]) ){.     
c5e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c5f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c600: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 53           rc2 = S
c610: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
c620: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
c630: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65  {.          pOpe
c640: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3d  n->aPending[i] =
c650: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
c660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c670: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
c680: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c690: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61  e3_free(pOpen->a
c6a0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  Pending);.      
c6b0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
c6c0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
c6d0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
c6e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c6f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
c700: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c710: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
c720: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
c730: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
c740: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
c750: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
c760: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
c770: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
c780: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
c790: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
c7a0: 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73 20  forms the parts 
c7b0: 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69  of the "close fi
c7c0: 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a  le" operation .*
c7d0: 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  * common to all 
c7e0: 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e  locking schemes.
c7f0: 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64   It closes the d
c800: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c  irectory and fil
c810: 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66  e.** handles, if
c820: 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c   they are valid,
c830: 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69   and sets all fi
c840: 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78  elds of the unix
c850: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
c860: 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74  e to 0..**.** It
c870: 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73   is *not* necess
c880: 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ary to hold the 
c890: 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20  mutex when this 
c8a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c8b0: 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78  d,.** even on Vx
c8c0: 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20  Works.  A mutex 
c8d0: 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64  will be acquired
c8e0: 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74   on VxWorks by t
c8f0: 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c  he.** vxworksRel
c900: 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75  easeFileId() rou
c910: 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
c920: 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  int closeUnixFil
c930: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
c940: 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
c950: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
c960: 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
c970: 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ile ){.    if( p
c980: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
c990: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
c9a0: 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  = close(pFile->d
c9b0: 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  irfd);.      if(
c9c0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
c9d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c9e0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c9f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ca00: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b  IOERR_DIR_CLOSE;
ca10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ca20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72        pFile->dir
ca30: 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  fd=-1;.      }. 
ca40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69     }.    if( pFi
ca50: 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
ca60: 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73    int err = clos
ca70: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
ca80: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
ca90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
caa0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
cab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
cac0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
cad0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
cae0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
caf0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
cb00: 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Id ){.      if( 
cb10: 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  pFile->isDelete 
cb20: 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69 6e  ){.        unlin
cb30: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
cb40: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
cb50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 78 77       }.      vxw
cb60: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
cb70: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
cb80: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20       pFile->pId 
cb90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
cba0: 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22  f.    OSTRACE2("
cbb0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
cbc0: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
cbd0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
cbe0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
cbf0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
cc00: 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72  xFile));.  }.  r
cc10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
cc30: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
cc40: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
cc50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
cc60: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
cc70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
cc80: 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
cc90: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
cca0: 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75  File *)id;.    u
ccb0: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
ccc0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
ccd0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
cce0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
ccf0: 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70  en && pFile->pOp
cd00: 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
cd10: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
cd20: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
cd30: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
cd40: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
cd50: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
cd60: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
cd70: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
cd80: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
cd90: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
cda0: 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
cdb0: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
cdc0: 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
cdd0: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
cde0: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
cdf0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
ce00: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
ce10: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
ce20: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
ce30: 20 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78       struct unix
ce40: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
ce50: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
ce60: 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69       aNew = sqli
ce70: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70 65  te3_realloc(pOpe
ce80: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f  n->aPending, (pO
ce90: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29  pen->nPending+1)
cea0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
ceb0: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
ced0: 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
cee0: 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65  s, just leak the
cef0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cf00: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
cf10: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
cf20: 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b  aPending = aNew;
cf30: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
cf40: 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
cf50: 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c  nPending] = pFil
cf60: 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70 4f  e->h;.        pO
cf70: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b  pen->nPending++;
cf80: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
cf90: 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
cfa0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
cfb0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  eLockInfo(pFile-
cfc0: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c  >pLock);.    rel
cfd0: 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c  easeOpenCnt(pFil
cfe0: 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72  e->pOpen);.    r
cff0: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
d000: 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
d010: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
d020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d030: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
d040: 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   End of the posi
d050: 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20  x advisory lock 
d060: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
d070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d080: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
d0d0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d120: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d140: 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
d150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d170: 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
d180: 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
d190: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
d1a0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
d1b0: 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
d1c0: 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
d1d0: 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
d1e0: 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
d1f0: 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
d200: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
d210: 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
d220: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
d230: 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
d240: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
d250: 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
d260: 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
d270: 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
d280: 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
d290: 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
d2a0: 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
d2b0: 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
d2c0: 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
d2d0: 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
d2e0: 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
d2f0: 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
d300: 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
d310: 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
d320: 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
d330: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
d340: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d350: 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
d360: 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
d370: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
d380: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
d390: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
d3a0: 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
d3b0: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
d3c0: 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
d3d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
d3e0: 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
d3f0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
d400: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
d410: 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
d420: 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
d430: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
d440: 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
d450: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68  tic int nolockCh
d460: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
d470: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
d480: 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73  tUsed, int *pRes
d490: 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
d4a0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
d4b0: 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
d4c0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
d4d0: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
d4e0: 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73  int nolockLock(s
d4f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
d500: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
d510: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
d520: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
d530: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
d540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d550: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
d560: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
d570: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
d580: 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
d590: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d5a0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
d5b0: 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
d5c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
d5e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
d5f0: 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  int nolockClose(
d600: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
d610: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f  ) {.  return clo
d620: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
d630: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
d640: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
d650: 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d  he no-op lock im
d660: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
d670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d680: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
d690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6d0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
d6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d720: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
d730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
d740: 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63  gin dot-file Loc
d750: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
d760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d770: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  ***.**.** The do
d780: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  tfile locking im
d790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
d7a0: 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6f  s the existing o
d7b0: 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
d7c0: 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65  ** files in orde
d7d0: 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  r to control acc
d7e0: 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
d7f0: 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
d800: 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75   on just.** abou
d810: 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
d820: 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
d830: 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
d840: 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
d850: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
d860: 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
d870: 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
d880: 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
d890: 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
d8a0: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
d8b0: 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
d8c0: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
d8d0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
d8e0: 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
d8f0: 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
d900: 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
d910: 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
d920: 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
d930: 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
d940: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
d950: 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
d960: 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
d970: 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
d980: 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
d990: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
d9a0: 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
d9b0: 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
d9c0: 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
d9d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
d9e0: 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
d9f0: 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 66 69  by creating a fi
da00: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  le in the same d
da10: 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a  irectory as the.
da20: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
da30: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
da40: 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
da50: 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
da60: 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
da70: 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istance of a loc
da80: 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61  k file implies a
da90: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
daa0: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  .  All other loc
dab0: 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52  k.** types (SHAR
dac0: 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45  ED, RESERVED, PE
dad0: 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65  NDING) are mappe
dae0: 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45  d into EXCLUSIVE
daf0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
db00: 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65  file suffix adde
db10: 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61  d to the data ba
db20: 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f  se filename in o
db30: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  rder to create t
db40: 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e  he.** lock file.
db50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c  .*/.#define DOTL
db60: 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63  OCK_SUFFIX ".loc
db70: 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  k"../*.** This r
db80: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
db90: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
dba0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
dbb0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
dbc0: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
dbd0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
dbe0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
dbf0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
dc00: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
dc10: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
dc20: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
dc30: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
dc40: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
dc50: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
dc60: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
dc70: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
dc80: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
dc90: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
dca0: 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20  *.** In dotfile 
dcb0: 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20  locking, either 
dcc0: 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72  a lock exists or
dcd0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53   it does not.  S
dce0: 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72  o in this.** var
dcf0: 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52  iation of CheckR
dd00: 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a  eservedLock(), *
dd10: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
dd20: 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f  o true if any lo
dd30: 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e  ck.** is held on
dd40: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61   the file and fa
dd50: 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  lse if the file 
dd60: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a  is unlocked..*/.
dd70: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
dd80: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
dd90: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
dda0: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
ddb0: 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
ddc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ddd0: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
dde0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ddf0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
de00: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
de10: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
de20: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
de30: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
de40: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
de50: 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
de60: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
de70: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
de80: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
de90: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
dea0: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
deb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
dec0: 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e  Either this conn
ded0: 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f  ection or some o
dee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
def0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
df00: 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73  ess.    ** holds
df10: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
df20: 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ile.  No need to
df30: 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20   check further. 
df40: 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  */.    reserved 
df50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
df60: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73    /* The lock is
df70: 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c   held if and onl
df80: 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c  y if the lockfil
df90: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
dfa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63  const char *zLoc
dfb0: 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  kFile = (const c
dfc0: 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
dfd0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
dfe0: 72 65 73 65 72 76 65 64 20 3d 20 61 63 63 65 73  reserved = acces
dff0: 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d  s(zLockFile, 0)=
e000: 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  =0;.  }.  OSTRAC
e010: 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
e020: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
e030: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e040: 72 76 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  rved);.  *pResOu
e050: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
e060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e070: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
e080: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
e090: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
e0a0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
e0b0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
e0c0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
e0d0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
e0e0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
e0f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
e100: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
e110: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
e120: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
e130: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
e140: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e150: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
e160: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
e170: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
e180: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
e190: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
e1a0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
e1b0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
e1c0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
e1d0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
e1e0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
e1f0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
e200: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
e210: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
e220: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
e230: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
e240: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
e250: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
e260: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
e270: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
e280: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
e290: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
e2a0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
e2b0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
e2c0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e2d0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e2e0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
e2f0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e300: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
e310: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
e320: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e330: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
e340: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
e350: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
e360: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
e370: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
e380: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a  ocking level..**
e390: 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65  .** With dotfile
e3a0: 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61   locking, we rea
e3b0: 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  lly only support
e3c0: 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c   state (4): EXCL
e3d0: 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65  USIVE..** But we
e3e0: 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72   track the other
e3f0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
e400: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73  internally..*/.s
e410: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
e420: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
e430: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
e440: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
e450: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e460: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
e470: 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f   fd;.  char *zLo
e480: 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
e490: 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
e4a0: 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
e4b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
e4c0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
e4d0: 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
e4e0: 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
e4f0: 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
e500: 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
e510: 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
e520: 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
e530: 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
e540: 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
e550: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e560: 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
e570: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
e580: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 23 69  e = locktype;.#i
e590: 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
e5a0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
e5b0: 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
e5c0: 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
e5d0: 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 7a   */.    utimes(z
e5e0: 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
e5f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
e600: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e610: 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
e620: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e630: 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28   */.  fd = open(
e640: 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e  zLockFile,O_RDON
e650: 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
e660: 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
e670: 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
e680: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
e690: 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
e6a0: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
e6b0: 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
e6c0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ock */.    int t
e6d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e6e0: 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
e6f0: 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
e700: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
e710: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
e720: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e730: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e740: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e750: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e760: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
e770: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e780: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e790: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e7a0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
e7b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e7c0: 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f 73 65    } .  if( close
e7d0: 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  (fd) ){.    pFil
e7e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e7f0: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
e800: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
e810: 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  E;.  }.  .  /* g
e820: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
e830: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
e840: 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
e850: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
e860: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
e870: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
e880: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e890: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
e8a0: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
e8b0: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
e8c0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e8d0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e8e0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e8f0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e900: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e910: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e920: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e930: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e940: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e950: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e960: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
e970: 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
e980: 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
e990: 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
e9a0: 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
e9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
e9c0: 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
e9d0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e9e0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
e9f0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ea00: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ea10: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
ea20: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
ea30: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
ea40: 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
ea50: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
ea60: 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
ea70: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
ea80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
ea90: 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69  ocktype,..   pFi
eaa0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
eab0: 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72  tpid());.  asser
eac0: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
ead0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
eae0: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
eaf0: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
eb00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
eb10: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
eb20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eb30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
eb40: 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
eb50: 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
eb60: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
eb70: 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
eb80: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
eb90: 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
eba0: 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
ebb0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
ebc0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ebd0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
ebe0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ebf0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
ec00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ec10: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
ec20: 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
ec30: 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
ec40: 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
ec50: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6c  e */.  assert( l
ec60: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
ec70: 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b   );.  if( unlink
ec80: 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20  (zLockFile) ){. 
ec90: 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
eca0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
ecb0: 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72  f( ENOENT != tEr
ecc0: 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
ecd0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ece0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ecf0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ed00: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  _UNLOCK);.    }.
ed10: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ed20: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ed30: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed40: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ed50: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
ed60: 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
ed70: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
ed80: 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
ed90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
eda0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
edb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
edc0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
edd0: 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
ede0: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
edf0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
ee00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ee10: 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  d) {.  int rc;. 
ee20: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
ee30: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
ee40: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
ee50: 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
ee60: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
ee70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ee80: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
ee90: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72  ontext);.  }.  r
eea0: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
eeb0: 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(id);.  return 
eec0: 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
eee0: 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
eef0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
ef00: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
ef10: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efb0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
efe0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
f010: 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
f020: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
f030: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
f040: 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
f050: 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
f060: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
f070: 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
f080: 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
f090: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
f0a0: 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
f0b0: 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
f0c0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
f0d0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
f0e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f0f0: 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
f100: 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
f110: 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
f120: 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
f130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
f140: 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
f150: 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
f160: 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
f170: 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
f180: 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
f190: 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
f1a0: 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
f1b0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
f1c0: 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
f1d0: 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
f1e0: 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
f1f0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f200: 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
f210: 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
f220: 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
f230: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
f240: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
f250: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
f260: 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
f270: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
f280: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
f290: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
f2a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
f2b0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
f2c0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
f2d0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
f2e0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
f2f0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
f300: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
f310: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
f320: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
f330: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
f340: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
f350: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
f360: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
f370: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
f380: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
f390: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
f3a0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
f3b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f3c0: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
f3d0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
f3e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f3f0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f400: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f410: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f420: 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
f430: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
f440: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
f450: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
f460: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
f470: 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
f480: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
f490: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
f4a0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
f4b0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
f4c0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
f4d0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
f4e0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
f4f0: 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
f500: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
f510: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
f520: 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
f530: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
f540: 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
f550: 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
f560: 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f     int lrc = flo
f570: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
f580: 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
f590: 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
f5a0: 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
f5b0: 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
f5c0: 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
f5d0: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
f5e0: 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
f5f0: 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
f600: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
f610: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f620: 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
f630: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
f640: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
f650: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f660: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f670: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f680: 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  _UNLOCK); .     
f690: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f6a0: 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
f6b0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
f6c0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
f6d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f6e0: 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
f6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
f700: 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
f710: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f720: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
f730: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
f740: 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
f750: 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
f760: 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
f770: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f780: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f790: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
f7a0: 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
f7b0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
f7c0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
f7d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f7e0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
f7f0: 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
f800: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
f810: 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52  STRACE4("TEST WR
f820: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e  -LOCK %d %d %d\n
f830: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
f840: 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 23 69 66   reserved);..#if
f850: 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
f860: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
f870: 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
f880: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
f890: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
f8a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f8b0: 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
f8c0: 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
f8d0: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
f8e0: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
f8f0: 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
f900: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
f910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f920: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
f930: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
f940: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
f950: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
f960: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
f970: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
f980: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
f990: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
f9a0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
f9b0: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
f9c0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
f9d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
f9e0: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
f9f0: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
fa00: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
fa10: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
fa20: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
fa30: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
fa40: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
fa50: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
fa60: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
fa70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
fa80: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
fa90: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
faa0: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
fab0: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
fac0: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
fad0: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
fae0: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
faf0: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
fb00: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
fb10: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
fb20: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
fb30: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
fb40: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
fb50: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
fb60: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
fb70: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
fb80: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
fb90: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
fba0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
fbb0: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
fbc0: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
fbd0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
fbe0: 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
fbf0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
fc00: 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
fc10: 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
fc20: 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
fc30: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
fc40: 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
fc50: 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
fc60: 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
fc70: 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
fc80: 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
fc90: 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
fca0: 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
fcb0: 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
fcc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
fcd0: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
fce0: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
fcf0: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
fd00: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
fd10: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
fd20: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
fd30: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
fd40: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fd50: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
fd60: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
fd70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
fd80: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
fd90: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
fda0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
fdb0: 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
fdc0: 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
fdd0: 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
fde0: 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
fdf0: 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
fe00: 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
fe10: 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
fe20: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
fe30: 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
fe40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
fe50: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe70: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
fe80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
fe90: 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66  ck */.  .  if (f
fea0: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
feb0: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
fec0: 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
fed0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fee0: 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
fef0: 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
ff00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
ff10: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ff20: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ff30: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
ff40: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ff50: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
ff60: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ff70: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
ff80: 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
ff90: 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
ffa0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
ffb0: 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
ffc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
ffd0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20   locktype;.  }. 
ffe0: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
fff0: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
10000 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
10010 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
10020 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
10030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
10040 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
10050 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
10060 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
10070 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
10080 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
10090 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
100a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
100b0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
100c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
100d0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
100e0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
100f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10100 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
10110 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
10120 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
10130 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
10140 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
10150 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10160 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10170 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10180 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10190 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
101a0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
101b0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
101c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
101d0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
101e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
101f0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10200 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
10210 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10220 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10230 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10240 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10250 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
10260 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
10270 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
10280 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
10290 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
102a0 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
102b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
102c0 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
102d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
102e0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
102f0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
10300 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
10310 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
10320 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
10330 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10350 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
10360 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
10370 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
10380 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
10390 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
103a0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
103b0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
103c0 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
103d0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
103e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
103f0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
10400 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
10410 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
10420 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
10430 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20  ;.  if (rc) {.  
10440 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20    int r, tErrno 
10450 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d  = errno;.    r =
10460 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10470 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10480 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10490 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
104a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
104b0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
104c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
104d0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64  rrno;.    }.#ifd
104e0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
104f0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
10500 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20  RS.    if( (r & 
10510 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
10520 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
10530 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54  .      r = SQLIT
10540 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65  E_BUSY;.    }.#e
10550 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
10560 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
10570 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a  _ERRORS */.    .
10580 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20      return r;.  
10590 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69  } else {.    pFi
105a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
105b0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
105c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
105d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
105e0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
105f0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
10600 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10610 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
10620 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
10630 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
10640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
10650 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10660 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
10670 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10680 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
10690 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
106a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
106b0 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
106c0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
106d0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
106f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107a0 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
107b0 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
107c0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
107e0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
107f0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
10800 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
10810 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
10820 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
10830 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
10840 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
10850 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
10860 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
10870 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
10880 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
10890 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
108a0 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
108b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
108c0 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
108d0 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
108e0 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
108f0 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
10900 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
10910 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
10920 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
10930 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
10940 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
10950 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
10960 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
10970 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
10980 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
10990 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
109a0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
109b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
109c0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
109d0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
109e0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
109f0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
10a00 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
10a10 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
10a20 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
10a30 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
10a40 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
10a50 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
10a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
10a70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10a80 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10a90 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
10aa0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
10ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
10ac0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
10ad0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10ae0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10af0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
10b00 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10b10 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10b20 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10b30 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10b40 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
10b50 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
10b60 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
10b70 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
10b80 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
10b90 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
10ba0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
10bb0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
10bc0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
10bd0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
10be0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
10bf0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
10c00 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
10c10 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
10c20 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20  ->pOpen->pSem;. 
10c30 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
10c40 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
10c50 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
10c60 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
10c70 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10c80 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
10c90 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
10ca0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10cb0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10cc0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10cd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
10ce0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
10cf0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
10d00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10d10 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
10d20 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
10d30 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
10d40 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
10d50 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
10d60 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
10d70 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 6c 6f  ved = (pFile->lo
10d80 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45 44 5f  cktype < SHARED_
10d90 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
10da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10db0 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
10dc0 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
10dd0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
10de0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
10df0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
10e00 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
10e10 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
10e20 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
10e30 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
10e40 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
10e50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10e60 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
10e70 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
10e80 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
10e90 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
10ea0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
10eb0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
10ec0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
10ed0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
10ee0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
10ef0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
10f00 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
10f10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
10f20 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
10f30 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
10f40 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
10f50 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
10f60 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
10f70 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
10f80 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
10f90 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
10fa0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
10fb0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
10fc0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
10fd0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
10fe0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
10ff0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
11000 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
11010 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
11020 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
11030 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
11040 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
11050 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
11060 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
11070 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
11080 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
11090 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
110a0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
110b0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
110c0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
110d0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
110e0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
110f0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
11100 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11110 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
11120 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
11130 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
11140 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
11150 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
11160 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
11170 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
11180 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
11190 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
111a0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
111b0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
111c0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
111d0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
111e0 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
111f0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
11200 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
11210 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
11220 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
11230 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
11240 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
11250 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
11260 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
11270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11280 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
11290 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
112a0 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
112b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
112c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
112d0 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
112e0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
112f0 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  en->pSem;.  int 
11300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11310 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
11320 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
11330 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
11340 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
11350 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
11360 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
11370 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
11380 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
11390 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
113a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
113b0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63 20  ocktype;.    rc 
113c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
113d0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
113e0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
113f0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
11400 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
11410 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
11420 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
11430 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
11440 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
11450 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11460 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
11470 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
11480 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
11490 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
114a0 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   */.  pFile->loc
114b0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
114c0 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
114d0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
114e0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
114f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11500 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11510 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
11520 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
11530 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
11540 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
11550 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
11560 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
11570 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
11580 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
11590 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
115a0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
115b0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
115c0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
115d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
115e0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
115f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11600 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
11610 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
11620 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11630 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
11640 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
11650 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20  pOpen->pSem;..  
11660 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11670 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
11680 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
11690 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
116a0 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
116b0 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
116c0 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  e,..   pFile->lo
116d0 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
116e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
116f0 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
11700 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
11710 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
11720 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11730 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
11740 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
11750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11760 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
11770 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
11780 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
11790 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
117a0 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
117b0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
117c0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
117d0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
117e0 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
117f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11800 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
11810 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
11820 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
11830 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
11840 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
11850 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
11860 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
11870 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11880 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
11890 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
118a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
118b0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
118c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
118d0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
118e0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
118f0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
11900 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
11910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11920 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
11930 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
11940 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65  tic int semClose
11950 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11960 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
11970 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
11980 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11990 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c  *)id;.    semUnl
119a0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
119b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
119c0 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
119d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
119e0 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
119f0 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
11a00 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
11a10 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
11a20 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
11a30 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
11a40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
11a50 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11a60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
11a70 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
11a80 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
11a90 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11aa0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
11ab0 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
11ac0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11ad0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
11ae0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
11af0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11b60 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
11bd0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
11be0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
11c10 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
11c20 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
11c30 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
11c40 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
11c50 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
11c60 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
11c70 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
11c80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
11c90 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
11ca0 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
11cb0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
11cc0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
11cd0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
11ce0 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
11cf0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
11d00 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
11d10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
11d20 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
11d30 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
11d40 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
11d50 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
11d60 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
11d70 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
11d80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
11d90 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
11da0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
11db0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73  gContext {.  uns
11dc0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11dd0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 63 6f  sharedByte;.  co
11de0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
11df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11e00 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
11e10 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  n file */.};..st
11e20 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
11e30 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
11e40 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
11e50 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
11e60 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
11e70 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
11e80 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
11e90 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
11ea0 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
11eb0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
11ec0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
11ed0 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
11ee0 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
11ef0 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
11f00 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
11f10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
11f20 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
11f30 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
11f40 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
11f50 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
11f60 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
11f70 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
11f80 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
11f90 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
11fa0 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fc0 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
11fd0 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
11fe0 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
11ff0 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
12000 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
12010 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
12020 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
12030 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a  geLockPB2)../*.*
12040 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
12050 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ity for setting 
12060 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69  or clearing a bi
12070 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20  t-range lock on 
12080 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79  an.** AFP filesy
12090 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74  stem..** .** Ret
120a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
120b0 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
120c0 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65  _BUSY on failure
120d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
120e0 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f  afpSetLock(.  co
120f0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12110 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
12120 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72   to be locked or
12130 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75   unlocked */.  u
12140 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12160 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
12170 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f  iptor on path */
12180 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
12190 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20   long offset,   
121a0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
121b0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
121c0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
121d0 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20  long length,    
121e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
121f0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
12200 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c  /* True to set l
12230 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63  ock.  False to c
12240 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  lear lock */.){.
12250 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
12260 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20  geLockPB2 pb;.  
12270 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62  int err;.  .  pb
12280 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65  .unLockFlag = se
12290 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20  tLockFlag ? 0 : 
122a0 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64  1;.  pb.startEnd
122b0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f  Flag = 0;.  pb.o
122c0 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
122d0 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65    pb.length = le
122e0 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d  ngth; .  pb.fd =
122f0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20   pFile->h;.  .  
12300 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45 54  OSTRACE6("AFPSET
12310 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
12320 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
12330 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
12340 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
12350 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
12360 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
12370 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
12380 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
12390 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  gth);.  err = fs
123a0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
123b0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
123c0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
123d0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
123e0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
123f0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12400 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  no;.    OSTRACE4
12410 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
12420 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
12430 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
12440 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
12450 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
12460 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66 64  r(tErrno));.#ifd
12470 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12480 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
12490 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
124a0 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20  _BUSY;.#else.   
124b0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
124c0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
124d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
124e0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c              setL
124f0 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45  ockFlag ? SQLITE
12500 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51  _IOERR_LOCK : SQ
12510 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12520 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  K);.#endif /* SQ
12530 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
12540 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
12550 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12560 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12570 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12580 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
12590 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
125a0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
125b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
125c0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
125d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
125e0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
125f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
12600 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
12610 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
12620 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
12630 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
12640 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
12650 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12660 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
12670 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
12680 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
12690 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
126a0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
126b0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
126c0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
126d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
126e0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
126f0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
12700 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
12710 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12720 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
12730 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
12740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12750 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12760 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12770 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12780 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12790 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
127a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
127b0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
127c0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
127d0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66  t( pFile );.  af
127e0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
127f0 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
12800 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
12810 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
12820 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
12830 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12840 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12850 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12860 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
12870 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
12880 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
12890 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
128a0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
128b0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
128c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
128d0 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
128e0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
128f0 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
12900 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
12910 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
12920 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
12930 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
12940 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
12950 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
12960 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
12970 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
12980 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
12990 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
129a0 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
129b0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
129c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
129d0 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
129e0 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
129f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
12a00 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
12a10 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
12a20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
12a30 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
12a40 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
12a50 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
12a60 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
12a70 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
12a80 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
12a90 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
12aa0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
12ab0 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
12ac0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54    }.  }.  .  OST
12ad0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
12ae0 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
12af0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12b00 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a  eserved);.  .  *
12b10 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
12b20 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
12b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12b40 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12b50 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12b60 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
12b70 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
12b80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12b90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12ba0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12bb0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12bc0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12bd0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12be0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12bf0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12c00 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12c10 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12c20 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12c30 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12c40 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12c50 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12c60 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12c70 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
12c80 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
12c90 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
12ca0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
12cb0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
12cc0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
12cd0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
12ce0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
12cf0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
12d00 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12d10 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12d20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12d30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12d40 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12d50 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12d60 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12d70 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
12d80 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
12d90 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12da0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
12db0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12dc0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
12dd0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
12de0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
12df0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
12e00 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12e10 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
12e20 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
12e30 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
12e40 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
12e50 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
12e60 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
12e70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12e80 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
12e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12ea0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12eb0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12ec0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
12ed0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
12ee0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
12ef0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
12f00 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
12f10 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12f20 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
12f30 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
12f40 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  was %s pid=%d\n"
12f50 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
12f60 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
12f70 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
12f80 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
12f90 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70  >locktype), getp
12fa0 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
12fb0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
12fc0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
12fd0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
12fe0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
12ff0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
13000 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
13010 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
13020 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
13030 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
13040 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
13050 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
13060 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
13070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
13080 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
13090 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
130a0 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
130b0 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
130c0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
130d0 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
130e0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
130f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13110 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
13120 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
13130 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
13140 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
13150 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
13160 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
13170 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
13180 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
13190 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
131a0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
131b0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
131c0 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
131d0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
131e0 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
131f0 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
13200 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
13210 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
13220 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
13230 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
13240 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
13250 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
13260 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
13270 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
13280 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
13290 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
132a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
132b0 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
132c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
132d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
132e0 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
132f0 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
13300 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
13310 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
13320 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
13330 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
13340 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
13350 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
13360 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
13370 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
13380 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
13390 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
133a0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
133b0 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
133c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
133d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
133e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
133f0 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
13400 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
13410 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13420 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13430 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
13440 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
13450 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
13460 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
13470 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
13480 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
13490 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
134a0 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
134b0 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
134c0 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
134d0 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
134e0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
134f0 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
13500 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
13510 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
13520 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
13530 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63 31 2c 20    int lk, lrc1, 
13540 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b  lrc2, lrc1Errno;
13550 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  .    .    /* Now
13560 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
13570 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
13580 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
13590 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
135a0 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
135b0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
135c0 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
135d0 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
135e0 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68  .    context->sh
135f0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
13600 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
13610 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
13620 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
13630 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13640 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
13650 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
13660 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
13670 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
13680 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
13690 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
136a0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
136b0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
136c0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
136d0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
136e0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
136f0 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
13700 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13710 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13720 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
13730 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
13740 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13750 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
13760 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13770 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
13780 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
13790 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
137a0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
137b0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
137c0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
137d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
137e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
137f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
13800 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
13810 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
13820 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
13830 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
13840 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
13850 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
13860 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
13870 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
13880 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13890 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
138a0 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
138b0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
138c0 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
138d0 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
138e0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
138f0 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
13900 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13910 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
13920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
13930 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
13940 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
13950 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
13960 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e    if (locktype >
13970 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
13980 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
13990 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe < RESERVED_LO
139a0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
139b0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
139c0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
139d0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
139e0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
139f0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13a00 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
13a10 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
13a20 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
13a30 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
13a40 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
13a50 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
13a60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
13a70 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
13a80 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
13a90 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
13aa0 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
13ab0 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
13ac0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
13ad0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13ae0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
13af0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
13b00 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
13b10 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
13b20 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
13b30 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13b40 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
13b50 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
13b80 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
13b90 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
13ba0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
13bb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
13bc0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
13bd0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
13be0 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
13bf0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
13c00 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
13c10 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13c20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
13c50 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
13c60 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
13c70 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
13c80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13c90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13ca0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
13cb0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
13cc0 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78  D_FIRST + contex
13cd0 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  t->sharedByte, 1
13ce0 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 1)) ){.       
13cf0 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73     /* Can't rees
13d00 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
13d10 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65  ed lock.  Sqlite
13d20 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69   can't deal, thi
13d30 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  s is.          *
13d40 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f  * a critical I/O
13d50 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
13d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
13d70 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51   = ((failed & SQ
13d80 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
13d90 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
13da0 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
13db0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
13dc0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
13dd0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
13de0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
13df0 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
13e00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
13e10 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
13e20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
13e30 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
13e40 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
13e50 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
13e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e70 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
13e80 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
13e90 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
13ea0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
13eb0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
13ec0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
13ed0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
13ee0 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
13ef0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13f00 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
13f10 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
13f20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
13f30 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
13f40 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ype), .         
13f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13f60 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13f80 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
13f90 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13fa0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
13fb0 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
13fc0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
13fd0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13fe0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13ff0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14000 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14010 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14020 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14030 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14040 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14050 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14060 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14070 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14080 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
14090 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
140a0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
140b0 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pe) {.  int rc =
140c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
140d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
140e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
140f0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14100 78 74 20 2a 70 43 74 78 20 3d 20 28 61 66 70 4c  xt *pCtx = (afpL
14110 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
14120 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
14130 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
14140 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14150 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
14160 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14170 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
14180 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
14190 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
141a0 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
141b0 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
141c0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
141d0 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
141e0 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
141f0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
14200 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14210 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
14220 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
14230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14240 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
14250 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
14260 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
14270 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
14280 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a 20 20 20  LOCK ){.    .   
14290 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
142a0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
142b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
142c0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
142d0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
142e0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
142f0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
14300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
14310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
14320 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14330 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK ){.        /*
14340 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
14350 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
14360 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
14370 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
14380 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
14390 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74  SHARED_FIRST+pCt
143a0 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  x->sharedByte;. 
143b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
143c0 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50  etLock(pCtx->dbP
143d0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
143e0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
143f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14400 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14410 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
14420 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
14430 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
14440 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
14450 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
14460 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
14470 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
14480 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
14490 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
144a0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
144b0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
144c0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
144d0 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
144e0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
144f0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
14500 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
14510 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
14520 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63 6c 65 61  K ){.    /* clea
14530 72 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  r the shared loc
14540 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 68 61  k */.    int sha
14550 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
14560 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d  ARED_FIRST+pCtx-
14570 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
14580 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
14590 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
145a0 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
145b0 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Byte, 1, 0);.  }
145c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
145d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
145e0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
145f0 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  CK ){.      stru
14600 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
14610 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
14620 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65  Open;.      pOpe
14630 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
14640 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
14650 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
14660 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c     if( pOpen->nL
14670 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d  ock==0 && pOpen-
14680 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20  >nPending>0 ){. 
14690 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
146a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
146b0 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  <pOpen->nPending
146c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
146d0 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50 65    if( pOpen->aPe
146e0 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20 63  nding[i] < 0 ) c
146f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14700 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 4f 70     if( close(pOp
14710 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29  en->aPending[i])
14720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14730 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14740 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
14750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14760 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20  E_IOERR_CLOSE;. 
14770 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
14780 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 65              pOpe
14790 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3d  n->aPending[i] =
147a0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
147b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
147c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
147d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
147e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
147f0 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
14800 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e  .          pOpen
14810 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
14820 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d            pOpen-
14830 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
14840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14850 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69  .    }.  }.  uni
14860 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
14870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14880 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
14890 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
148a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
148b0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
148c0 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
148d0 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
148e0 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
148f0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
14900 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
14910 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
14920 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
14930 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14940 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
14950 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
14960 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
14970 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
14980 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26  ( pFile->pOpen &
14990 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  & pFile->pOpen->
149a0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
149b0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
149c0 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
149d0 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
149e0 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
149f0 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
14a00 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
14a10 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
14a20 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
14a30 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
14a40 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
14a50 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50  tor to pOpen->aP
14a60 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
14a70 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
14a80 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
14a90 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
14aa0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
14ab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14ac0 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20  int *aNew;.     
14ad0 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
14ae0 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69  Cnt *pOpen = pFi
14af0 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20  le->pOpen;.     
14b00 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
14b10 72 65 61 6c 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61  realloc(pOpen->a
14b20 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d  Pending, (pOpen-
14b30 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a  >nPending+1)*siz
14b40 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20  eof(int) );.    
14b50 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
14b60 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
14b70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
14b80 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
14b90 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
14ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14bb0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
14bc0 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  ding = aNew;.   
14bd0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
14be0 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ding[pOpen->nPen
14bf0 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68  ding] = pFile->h
14c00 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
14c10 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20  >nPending++;.   
14c20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
14c30 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
14c40 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  }.    releaseOpe
14c50 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
14c60 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
14c70 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
14c80 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
14c90 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
14ca0 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
14cb0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
14cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14cd0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
14ce0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
14cf0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14d00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14d10 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
14d20 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
14d30 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14d40 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14d50 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
14d60 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
14d70 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
14d80 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
14d90 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
14da0 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
14db0 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14dc0 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14dd0 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
14de0 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
14df0 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
14e00 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
14e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
14e20 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
14e30 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14e40 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14e50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ea0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
14eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
14f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
14f10 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
14f20 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
14f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
14f50 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
14f60 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
14f70 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
14f80 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
14f90 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
14fa0 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
14fb0 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
14fc0 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
14fd0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
14fe0 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
14ff0 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
15000 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
15010 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
15020 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
15030 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
15040 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
15050 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
15060 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
15070 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
15080 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
15090 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
150a0 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
150b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
150c0 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
150d0 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
150e0 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
150f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15100 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
15110 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
15120 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
15130 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
15140 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
15150 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
15160 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
15170 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
15180 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
15190 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
151a0 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
151b0 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
151c0 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
151d0 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
151e0 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79   any any form by
151f0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
15200 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
15210 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
15220 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
15230 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
15240 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
15250 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
15260 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
15270 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
15280 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
15290 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
152a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
152b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
152c0 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
152d0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
152e0 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
152f0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
15300 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
15310 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
15320 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
15330 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
15340 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72  READ).  got = pr
15350 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
15360 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
15370 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15380 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
15390 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
153a0 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d  PREAD64).  got =
153b0 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20   pread64(id->h, 
153c0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
153d0 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  t);.  SimulateIO
153e0 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
153f0 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
15400 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
15410 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
15420 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74  _SET);.  Simulat
15430 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
15440 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e  set-- );.  if( n
15450 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
15460 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   ){.    if( newO
15470 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
15480 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
15490 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
154a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c  = errno;.    }el
154b0 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  se{.      ((unix
154c0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
154d0 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20  rrno = 0;....   
154e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31   }.    return -1
154f0 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65  ;.  }.  got = re
15500 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
15510 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
15520 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
15530 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
15540 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15550 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
15560 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28  .  }.  OSTRACE5(
15570 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
15580 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
15590 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
155a0 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
155b0 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  ED);.  return go
155c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
155d0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
155e0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
155f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
15600 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
15610 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
15620 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
15630 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
15640 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
15650 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
15660 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
15670 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15680 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
15690 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
156a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
156b0 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74  set.){.  int got
156c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
156d0 3b 0a 0a 20 20 2f 2a 20 4e 65 76 65 72 20 72 65  ;..  /* Never re
156e0 61 64 20 6f 72 20 77 72 69 74 65 20 61 6e 79 20  ad or write any 
156f0 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
15700 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
15710 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  e */.  assert( (
15720 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
15730 69 73 4c 6f 63 6b 61 62 6c 65 3d 3d 30 0a 20 20  isLockable==0.  
15740 20 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65          || offse
15750 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15760 35 31 32 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  512.          ||
15770 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
15780 44 49 4e 47 5f 42 59 54 45 20 29 3b 0a 0a 20 20  DING_BYTE );..  
15790 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
157a0 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  d((unixFile*)id,
157b0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
157c0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
157d0 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
157e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
157f0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
15800 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
15810 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
15820 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
15830 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15840 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
15850 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
15860 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15870 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
15880 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
15890 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
158a0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
158b0 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
158c0 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
158d0 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
158e0 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
158f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15900 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15910 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
15920 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
15930 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
15940 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
15950 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
15960 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
15970 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15980 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
15990 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
159a0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
159b0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
159c0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
159d0 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
159e0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
159f0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
15a00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
15a20 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
15a30 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
15a40 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
15a50 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
15a60 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34    int got;.  i64
15a70 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49   newOffset;.  TI
15a80 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
15a90 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
15aa0 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
15ab0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15ac0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69  t, offset);.#eli
15ad0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
15ae0 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
15af0 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
15b00 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
15b10 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
15b20 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
15b30 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
15b40 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77  _SET);.  if( new
15b50 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
15b60 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
15b70 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
15b80 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
15b90 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
15ba0 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
15bb0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
15bc0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15bd0 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
15be0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
15bf0 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74    }.  got = writ
15c00 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
15c10 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
15c20 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
15c30 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
15c40 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
15c50 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15c60 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35 28    }..  OSTRACE5(
15c70 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
15c80 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
15c90 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
15ca0 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
15cb0 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  ED);.  return go
15cc0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15cd0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
15ce0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
15cf0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
15d00 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
15d10 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
15d20 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
15d30 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
15d40 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
15d50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15d60 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
15d70 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
15d80 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
15d90 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15da0 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
15db0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
15dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
15dd0 30 20 29 3b 0a 0a 20 20 2f 2a 20 4e 65 76 65 72  0 );..  /* Never
15de0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
15df0 6e 79 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  ny of the bytes 
15e00 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
15e10 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
15e20 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ( ((unixFile*)id
15e30 29 2d 3e 69 73 4c 6f 63 6b 61 62 6c 65 3d 3d 30  )->isLockable==0
15e40 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 66  .          || of
15e50 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
15e60 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 20 20  TE+512.         
15e70 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
15e80 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 29 3b 0a  PENDING_BYTE );.
15e90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15ea0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
15eb0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
15ec0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
15ed0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
15ee0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
15ef0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
15f00 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
15f10 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
15f20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
15f30 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
15f40 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
15f50 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
15f60 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
15f70 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
15f80 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
15f90 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
15fa0 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
15fb0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
15fc0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
15fd0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15fe0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
15ff0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
16000 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16010 65 2a 29 69 64 3b 0a 20 20 20 20 70 46 69 6c 65  e*)id;.    pFile
16020 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
16030 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16040 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
16050 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
16060 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
16070 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
16080 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
16090 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
160a0 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
160b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
160c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
160d0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
160e0 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
160f0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
16100 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
16110 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16120 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
16130 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
16140 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
16150 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
16160 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
16170 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
16180 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
16190 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
161a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
161b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
161c0 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
161d0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
161e0 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46 69 6c  ndWrite((unixFil
161f0 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70  e*)id, offset, p
16200 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
16210 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
16220 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
16230 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
16240 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
16250 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
16260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
16270 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
16280 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
16290 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
162a0 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
162b0 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  ));.  if( amt>0 
162c0 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
162d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  <0 ){.      /* l
162e0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
162f0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
16300 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16310 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
16320 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16330 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
16340 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
16350 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
16360 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
16370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
16380 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
16390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
163a0 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
163b0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
163c0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
163d0 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
163e0 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
163f0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
16400 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
16410 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
16420 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
16430 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
16440 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16450 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
16460 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
16470 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
16480 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
16490 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
164a0 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
164b0 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
164c0 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
164d0 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
164e0 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
164f0 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
16500 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72  with the (slower
16510 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66  ) fsync()..** If
16520 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
16530 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
16540 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
16550 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
16560 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
16570 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
16580 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
16590 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
165a0 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
165b0 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
165c0 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  _).# define fdat
165d0 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
165e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
165f0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
16600 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
16610 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
16620 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
16630 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
16640 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
16650 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
16660 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
16670 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
16680 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
16690 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
166a0 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
166b0 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
166c0 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
166d0 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
166e0 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
166f0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
16700 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
16710 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
16720 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
16730 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
16740 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
16750 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
16760 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
16770 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
16780 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
16790 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
167a0 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
167b0 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
167c0 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
167d0 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
167e0 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
167f0 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
16800 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
16810 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
16820 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
16830 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
16840 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
16850 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
16860 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
16870 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
16880 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
16890 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
168a0 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
168b0 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
168c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
168d0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ..**.** SQLite s
168e0 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79  ets the dataOnly
168f0 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a   flag if the siz
16900 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
16910 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54   unchanged..** T
16920 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64  he idea behind d
16930 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20  ataOnly is that 
16940 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77  it should only w
16950 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f  rite the file co
16960 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b  ntent.** to disk
16970 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e  , not the inode.
16980 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61    We only set da
16990 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  taOnly if the fi
169a0 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75  le size is .** u
169b0 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74  nchanged since t
169c0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
169d0 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64  part of the inod
169e0 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a  e.  However, .**
169f0 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20   Ted Ts'o tells 
16a00 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  us that fdatasyn
16a10 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72  c() will also wr
16a20 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66  ite the inode if
16a30 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a   the.** file siz
16a40 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  e has changed.  
16a50 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69  The only real di
16a60 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
16a70 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20   fdatasync().** 
16a80 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64  and fsync(), Ted
16a90 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68   tells us, is th
16aa0 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
16ab0 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68  ill not flush th
16ac0 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68  e.** inode if th
16ad0 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72  e mtime or owner
16ae0 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20   or other inode 
16af0 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20  attributes have 
16b00 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f  changed..** We o
16b10 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
16b20 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f  he file size, no
16b30 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65  t the other file
16b40 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a   attributes, so.
16b50 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c  ** as far as SQL
16b60 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ite is concerned
16b70 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29  , an fdatasync()
16b80 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75   is always adequ
16b90 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61  ate..** So, we a
16ba0 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73  lways use fdatas
16bb0 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61  ync() if it is a
16bc0 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64  vailable, regard
16bd0 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76  less of.** the v
16be0 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
16bf0 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74  Only flag..*/.st
16c00 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
16c10 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
16c20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
16c30 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
16c40 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
16c50 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
16c60 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
16c70 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
16c80 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
16c90 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
16ca0 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
16cb0 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
16cc0 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
16cd0 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
16ce0 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
16cf0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16d00 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
16d10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
16d20 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
16d30 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
16d40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16d50 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
16d60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
16d70 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
16d80 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
16d90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16da0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
16db0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
16dc0 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
16dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16de0 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
16df0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
16e00 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
16e10 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
16e20 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
16e30 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
16e40 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
16e50 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
16e60 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
16e70 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
16e80 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
16e90 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
16ea0 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
16eb0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16ec0 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
16ed0 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
16ee0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
16ef0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
16f00 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16f10 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
16f20 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
16f30 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
16f40 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
16f50 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
16f60 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16f70 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
16f80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
16f90 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
16fa0 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
16fb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
16fc0 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
16fd0 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
16fe0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
16ff0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
17000 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
17010 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
17020 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
17030 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
17040 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
17050 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
17060 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
17070 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
17080 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
17090 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
170a0 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
170b0 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
170c0 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
170d0 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
170e0 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
170f0 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
17100 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
17110 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
17120 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
17130 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
17140 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
17150 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
17160 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
17170 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
17180 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
17190 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
171a0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
171b0 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
171c0 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65  sync(fd);..#else
171d0 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
171e0 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
171f0 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
17200 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
17210 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
17220 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
17230 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
17240 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
17250 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
17260 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
17270 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
17280 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
17290 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
172a0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
172b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
172c0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
172d0 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
172e0 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
172f0 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
17300 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
17310 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
17320 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
17330 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
17340 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
17350 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
17360 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
17370 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
17380 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
17390 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
173a0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
173b0 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
173c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
173d0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
173e0 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
173f0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
17400 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
17410 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
17420 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17430 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
17440 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
17450 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
17460 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
17470 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
17480 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
17490 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
174a0 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
174b0 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
174c0 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
174d0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
174e0 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
174f0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
17500 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
17510 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
17520 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17530 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
17540 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
17550 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
17560 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
17570 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
17580 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
17590 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
175a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
175b0 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
175c0 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
175d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
175e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
175f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17600 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
17610 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
17620 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
17630 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
17640 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
17650 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
17660 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
17670 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
17680 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
17690 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
176a0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
176b0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
176c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
176d0 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
176e0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
176f0 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
17700 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
17710 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
17720 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17730 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
17740 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
17750 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
17760 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
17770 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
17780 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
17790 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
177a0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
177b0 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
177c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
177d0 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43    OSTRACE2("SYNC
177e0 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
177f0 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66  le->h);.  rc = f
17800 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
17810 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
17820 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
17830 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
17840 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
17850 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
17860 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
17870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17880 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b  ITE_IOERR_FSYNC;
17890 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
178a0 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ->dirfd>=0 ){.  
178b0 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f    int err;.    O
178c0 53 54 52 41 43 45 34 28 22 44 49 52 53 59 4e 43  STRACE4("DIRSYNC
178d0 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c   %-3d (have_full
178e0 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e  fsync=%d fullsyn
178f0 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  c=%d)\n", pFile-
17900 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20  >dirfd,.        
17910 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59      HAVE_FULLFSY
17920 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b  NC, isFullsync);
17930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17940 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
17950 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
17960 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c  tory sync is onl
17970 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66  y attempted if f
17980 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20  ull_fsync is.   
17990 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   ** turned off o
179a0 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  r unavailable.  
179b0 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20  If a full_fsync 
179c0 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a  occurred above,.
179d0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
179e0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
179f0 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20  s superfluous.. 
17a00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
17a10 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c  HAVE_FULLFSYNC |
17a20 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26  | !isFullsync) &
17a30 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  & full_fsync(pFi
17a40 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29  le->dirfd,0,0) )
17a50 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  {.       /*.    
17a60 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65     ** We have re
17a70 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
17a80 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63  reports of fsync
17a90 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  () returning.   
17aa0 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68      ** errors wh
17ab0 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69  en applied to di
17ac0 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72  rectories on cer
17ad0 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d  tain file system
17ae0 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66  s..       ** A f
17af0 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20  ailed directory 
17b00 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69  sync is not a bi
17b10 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73  g deal.  So it s
17b20 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62  eems.       ** b
17b30 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  etter to ignore 
17b40 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b  the error.  Tick
17b50 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20  et #1657.       
17b60 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69  */.       /* pFi
17b70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17b80 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20  errno; */.      
17b90 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
17ba0 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
17bb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72  }.#endif.    err
17bc0 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
17bd0 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20  dirfd); /* Only 
17be0 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
17bf0 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
17c00 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d  */.    if( err==
17c10 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
17c20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77    /* directory w
17c30 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20  hen we are done 
17c40 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
17c50 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20  dirfd = -1;.    
17c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17c70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17c80 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
17c90 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
17ca0 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a  IR_CLOSE;.    }.
17cb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
17cd0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
17ce0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
17cf0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
17d00 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
17d10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17d20 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
17d30 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
17d40 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74   id );.  Simulat
17d50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17d60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
17d70 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d  UNCATE );.  rc =
17d80 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69   ftruncate(((uni
17d90 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  xFile*)id)->h, (
17da0 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
17db0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 28 28  if( rc ){.    ((
17dc0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
17dd0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
17de0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17df0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
17e00 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
17e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17e20 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
17e30 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
17e40 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
17e50 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
17e60 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17e70 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
17e80 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
17e90 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
17ea0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
17eb0 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
17ec0 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  d );.  rc = fsta
17ed0 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
17ee0 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
17ef0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
17f00 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
17f10 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
17f20 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
17f30 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17f50 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
17f60 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
17f70 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
17f80 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
17f90 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
17fa0 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49  e, the findLockI
17fb0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
17fc0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
17fd0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
17fe0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
17ff0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
18000 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
18010 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
18020 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
18030 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
18040 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
18050 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
18060 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
18070 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
18080 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
18090 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
180a0 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
180b0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
180c0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
180d0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
180e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
180f0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
18100 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18110 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
18120 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
18130 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
18140 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
18150 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
18160 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
18170 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
18180 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
18190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
181a0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
181b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
181c0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
181d0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  f.../*.** Inform
181e0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
181f0 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
18200 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
18210 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
18220 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
18230 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
18240 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
18250 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
18260 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18270 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
18280 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
18290 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65  Arg = ((unixFile
182a0 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
182b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
182c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
182d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
182e0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
182f0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18300 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18310 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
18320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18330 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  _OK;.    }.#ifnd
18340 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
18350 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
18360 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
18370 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
18380 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
18390 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
183a0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
183b0 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
183c0 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
183d0 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
183e0 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
183f0 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
18400 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
18410 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
18420 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
18430 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
18440 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
18450 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18460 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
18470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
18490 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
184a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
184b0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
184c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
184d0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
184e0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
184f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
18500 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
18510 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
18520 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
18530 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
18540 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
18550 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18560 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
18570 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18580 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
18590 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
185a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
185b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
185c0 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
185d0 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
185e0 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
185f0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
18600 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
18610 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
18620 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
18630 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
18640 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
18650 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
18660 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
18670 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
18680 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
18690 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
186a0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
186b0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
186c0 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
186d0 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
186e0 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
186f0 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
18700 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
18710 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
18720 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
18730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18740 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
18750 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
18760 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
18770 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
18780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18790 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
187a0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
187b0 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
187c0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
187d0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54   for the file. T
187e0 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 20  his is always 0 
187f0 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for unix..*/.sta
18800 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
18810 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
18820 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
18830 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
18840 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
18850 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
18860 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  0;.}../*.** Here
18870 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
18880 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
18890 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
188a0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
188c0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
188d0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
188e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
18950 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
18960 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
18970 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
18980 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
18990 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
189a0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
189b0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
189c0 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
189d0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
189e0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
189f0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
18a00 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
18a10 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
18a20 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
18a30 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
18a40 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
18a50 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
18a60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
18a70 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
18a80 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
18a90 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
18aa0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
18ab0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
18ac0 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
18ad0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
18ae0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
18af0 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
18b00 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
18b10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18b20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
18b30 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
18b40 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
18b50 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
18b60 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
18b70 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
18b80 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
18b90 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
18ba0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
18bb0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
18bc0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
18bd0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
18be0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
18bf0 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
18c00 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
18c10 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
18c20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
18c30 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
18c40 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
18c50 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
18c60 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
18c70 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
18c80 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
18c90 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
18ca0 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
18cb0 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
18cc0 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
18cd0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
18ce0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
18cf0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
18d00 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
18d10 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
18d20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
18d30 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
18d40 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
18d50 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
18d60 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
18d70 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
18d80 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
18d90 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
18da0 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
18db0 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
18dc0 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
18dd0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
18de0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
18df0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
18e00 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
18e10 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
18e20 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
18e30 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
18e40 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
18e50 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
18e60 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
18e70 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
18e80 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
18e90 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
18ea0 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
18eb0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
18ec0 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
18ed0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
18ee0 2c 20 4d 45 54 48 4f 44 2c 20 43 4c 4f 53 45 2c  , METHOD, CLOSE,
18ef0 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
18f00 4b 4c 4f 43 4b 29 20 20 20 20 20 20 20 20 20 20  KLOCK)          
18f10 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
18f20 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
18f30 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
18f40 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 5c 0a 20 20 20 31 2c 20 20 20 20 20      \.   1,     
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
18f90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
190b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
190c0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
190f0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
19140 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19160 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19190 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191b0 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
191e0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19200 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19230 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
19240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19250 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19260 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
19270 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
19280 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
19290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
192a0 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
192d0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
192e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
192f0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
19320 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
19330 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65 76  istics   /* xDev
19340 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
19350 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19360 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
193c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
193d0 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
193e0 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
193f0 20 2a 7a 2c 20 69 6e 74 20 68 29 7b 20 20 20 20   *z, int h){    
19400 20 20 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f       \.  UNUSED_
19410 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
19420 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 68  USED_PARAMETER(h
19430 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
19460 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
19500 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
19510 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
19520 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
19530 2c 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20  ,int)           
19540 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
19550 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
19560 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
19570 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
19580 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
19590 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
195a0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
195b0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
195c0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
195d0 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
195e0 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
195f0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
19600 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
19610 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
19620 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
19630 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
19640 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
19650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
19660 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
19670 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
19680 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
19690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
196a0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
196b0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
196c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
196d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
196e0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
196f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
19700 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
19710 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
19720 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78  vedLock     /* x
19730 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19740 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
19750 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
19760 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
19770 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
19780 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
19790 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
197a0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
197b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
197c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
197d0 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
19800 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19820 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
19830 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
19840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19850 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
19860 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
19870 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
19880 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
19890 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
198a0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
198b0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
198c0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
198d0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
198e0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
198f0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
19900 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19910 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
19920 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
19930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19940 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
19950 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19970 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
19980 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
19990 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
199a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
199b0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
199c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a  ReservedLock  /*
199d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
199e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
199f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
19a00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
19a10 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
19a20 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
19a30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
19a40 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
19a50 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
19a60 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
19a70 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
19a80 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
19a90 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
19aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19ab0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
19ac0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
19af0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
19b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19b10 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
19b20 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
19b30 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
19b40 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
19b50 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
19b60 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
19b70 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
19b80 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
19b90 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
19ba0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
19bb0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
19bc0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
19bd0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
19be0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
19bf0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ect name */.  se
19c00 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
19c10 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
19c20 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
19c30 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
19c40 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
19c50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
19c60 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
19c70 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
19c80 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
19c90 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
19ca0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
19cb0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
19cc0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
19cd0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
19ce0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19cf0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19d00 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
19d10 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
19d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19d30 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
19d40 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
19d50 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
19d60 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
19d70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
19d80 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  ct name */.  afp
19d90 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
19da0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
19db0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
19dc0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
19dd0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
19de0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
19df0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
19e00 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
19e10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
19e20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19e30 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
19e40 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
19e50 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
19e60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
19e70 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
19e80 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
19e90 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
19ea0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
19eb0 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
19ec0 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
19ed0 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
19ee0 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
19ef0 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
19f00 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
19f10 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
19f20 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
19f30 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
19f40 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
19f50 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
19f60 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
19f70 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
19f80 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
19f90 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
19fa0 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
19fb0 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
19fc0 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
19fd0 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
19fe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
19ff0 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
1a000 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
1a010 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
1a020 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
1a030 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
1a040 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
1a050 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a060 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1a070 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1a080 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1a090 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
1a0a0 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
1a0b0 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
1a0c0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
1a0d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1a0e0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1a0f0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1a100 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
1a110 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1a120 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1a130 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
1a140 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
1a150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a160 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1a170 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
1a180 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1a190 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1a1a0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1a1b0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  ame */.  proxyCl
1a1c0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1a1d0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1a1e0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
1a1f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1a200 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1a210 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
1a220 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1a230 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1a240 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
1a250 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1a260 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1a270 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1a280 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  */.).#endif...#i
1a290 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1a2a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1a2b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1a2c0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
1a2d0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1a2e0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
1a2f0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
1a300 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
1a310 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
1a320 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
1a330 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
1a340 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
1a350 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
1a360 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
1a370 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
1a380 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
1a390 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
1a3a0 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
1a3b0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1a3c0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
1a3d0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
1a3e0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1a3f0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
1a400 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1a410 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1a420 6e 74 20 66 64 20 20 20 20 20 20 20 20 20 20 20  nt fd           
1a430 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
1a440 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
1a450 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a460 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
1a470 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1a480 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
1a490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1a4a0 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
1a4b0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
1a4c0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
1a4d0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
1a4e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
1a4f0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
1a500 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
1a510 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
1a520 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
1a530 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
1a540 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
1a550 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
1a560 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
1a570 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
1a580 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
1a590 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a5a0 4e 41 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e  NABLE_AFP_LOCKIN
1a5b0 47 5f 53 4d 42 0a 20 20 20 20 7b 20 22 73 6d 62  G_SMB.    { "smb
1a5c0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
1a5d0 6f 64 73 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20  ods },.#else.   
1a5e0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 66 6c   { "smbfs",  &fl
1a5f0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
1a600 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 77 65  #endif.    { "we
1a610 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
1a620 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
1a630 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
1a640 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
1a650 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
1a660 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
1a670 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
1a680 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
1a690 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
1a6a0 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
1a6b0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
1a6c0 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
1a6d0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
1a6e0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1a6f0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
1a700 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
1a710 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
1a720 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
1a730 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
1a740 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
1a750 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
1a760 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
1a770 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
1a780 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1a790 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1a7a0 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
1a7b0 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
1a7c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
1a7d0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
1a7e0 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
1a7f0 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
1a800 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
1a810 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
1a820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a830 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
1a840 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
1a850 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
1a860 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
1a870 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
1a880 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
1a890 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
1a8a0 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
1a8b0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
1a8c0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
1a8d0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
1a8e0 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
1a8f0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
1a900 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
1a910 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
1a920 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
1a930 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
1a940 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
1a950 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 66  K;.  if( fcntl(f
1a960 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  d, F_GETLK, &loc
1a970 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
1a980 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
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 72 65 74 75 72 6e 20 26  se{.    return &
1a9b0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
1a9c0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
1a9d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1a9e0 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
1a9f0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
1aa00 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  r)(const char*,i
1aa10 6e 74 29 0a 20 20 20 20 20 20 20 20 3d 20 61 75  nt).        = au
1aa20 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
1aa30 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
1aa40 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1aa50 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
1aa60 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1aa70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
1aa80 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
1aa90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
1aaa0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
1aab0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
1aac0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
1aad0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
1aae0 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
1aaf0 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
1ab00 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
1ab70 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
1ab80 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1aba0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
1abb0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
1abc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1abd0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
1abe0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
1abf0 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
1ac00 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1ac10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1ac20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1ac30 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1ac40 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
1ac50 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
1ac60 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
1ac70 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
1ac80 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
1ac90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1aca0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
1acb0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
1acc0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
1acd0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
1ace0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c   */.  int dirfd,
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad00 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
1ad10 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1ad20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
1ad30 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
1ad40 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
1ad50 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
1ad60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ad70 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
1ad80 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1ad90 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
1ada0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20  .  int noLock,  
1adb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d             /* Om
1adc0 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72  it locking if tr
1add0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65  ue */.  int isDe
1ade0 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20  lete            
1adf0 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
1ae00 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  se if true */.){
1ae10 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
1ae20 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
1ae30 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
1ae40 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
1ae50 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
1ae60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ae70 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1ae80 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55   pNew->pLock==NU
1ae90 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
1aea0 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c  pNew->pOpen==NUL
1aeb0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d  L );..  /* Param
1aec0 65 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73  eter isDelete is
1aed0 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78   only used on vx
1aee0 77 6f 72 6b 73 2e 0a 20 20 2a 2a 20 45 78 70 72  works..  ** Expr
1aef0 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
1af00 74 6c 79 20 68 65 72 65 20 74 6f 20 70 72 65 76  tly here to prev
1af10 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
1af20 6e 69 6e 67 73 0a 20 20 2a 2a 20 61 62 6f 75 74  nings.  ** about
1af30 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
1af40 72 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 4f 53  rs..  */.#if !OS
1af50 5f 56 58 57 4f 52 4b 53 0a 20 20 55 4e 55 53 45  _VXWORKS.  UNUSE
1af60 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
1af70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  lete);.#endif.. 
1af80 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20   OSTRACE3("OPEN 
1af90 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
1afa0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20  , zFilename);   
1afb0 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b   .  pNew->h = h;
1afc0 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
1afd0 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48   dirfd;.  SET_TH
1afe0 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 23  READID(pNew);..#
1aff0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1b000 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
1b010 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
1b020 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1b030 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
1b040 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
1b050 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b060 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1b070 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
1b080 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
1b090 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
1b0a0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
1b0b0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
1b0c0 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
1b0d0 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
1b0e0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
1b0f0 2c 20 68 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  , h);.#if SQLITE
1b100 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1b110 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
1b120 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
1b130 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
1b140 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
1b150 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
1b160 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
1b170 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
1b180 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
1b190 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
1b1a0 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
1b1b0 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
1b1c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
1b1d0 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
1b1e0 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
1b1f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
1b200 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
1b210 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
1b220 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
1b230 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
1b240 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1b250 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
1b260 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
1b270 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
1b280 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f  pNew, &pNew->pLo
1b290 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e  ck, &pNew->pOpen
1b2a0 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
1b2b0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
1b2c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b2d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1b2e0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b2f0 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
1b300 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1b310 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
1b320 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
1b330 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1b340 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1b350 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1b360 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1b370 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1b380 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
1b390 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1b3a0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
1b3b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1b3c0 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
1b3d0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1b3e0 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
1b3f0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
1b400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b410 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1b420 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
1b430 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
1b440 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
1b450 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
1b460 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
1b470 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
1b480 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
1b490 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
1b4a0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
1b4b0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
1b4c0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
1b4d0 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
1b4e0 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
1b4f0 65 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  e;.      srandom
1b500 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
1b510 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1b520 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f       rc = findLo
1b530 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 4e 55 4c  ckInfo(pNew, NUL
1b540 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  L, &pNew->pOpen)
1b550 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  ;.      unixLeav
1b560 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
1b570 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
1b580 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
1b590 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1b5a0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
1b5b0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
1b5c0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
1b5d0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
1b5e0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
1b5f0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
1b600 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
1b610 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
1b620 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
1b630 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
1b640 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
1b650 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
1b660 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
1b670 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
1b680 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
1b690 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1b6a0 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
1b6b0 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
1b6c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1b6d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b6f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b700 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
1b710 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
1b720 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
1b730 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
1b740 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
1b750 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
1b760 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
1b770 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
1b780 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1b790 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
1b7a0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
1b7b0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
1b7c0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
1b7d0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
1b7e0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
1b7f0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
1b800 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
1b810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
1b820 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b830 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1b840 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1b850 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1b860 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28  Open);.    if( (
1b870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1b880 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e  & (pNew->pOpen->
1b890 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
1b8a0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
1b8b0 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f 70 65  ame = pNew->pOpe
1b8c0 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  n->aSemName;.   
1b8d0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1b8e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b8f0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1b900 53 65 6d 4e 61 6d 65 2c 20 22 25 73 2e 73 65 6d  SemName, "%s.sem
1b910 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b920 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1b930 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
1b940 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
1b950 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=0; zSemName[n
1b960 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
1b970 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
1b980 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
1b990 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
1b9a0 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53   pNew->pOpen->pS
1b9b0 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
1b9c0 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
1b9d0 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
1b9e0 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e   if( pNew->pOpen
1b9f0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
1ba00 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
1ba10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1ba20 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
1ba30 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65  >pOpen->aSemName
1ba40 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
1ba50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
1ba60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1ba70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
1ba80 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
1ba90 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
1baa0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
1bab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
1bac0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
1bad0 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
1bae0 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
1baf0 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
1bb00 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
1bb10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bb20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  ){.    if( dirfd
1bb30 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
1bb40 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c 65  d); /* silent le
1bb50 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
1bb60 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
1bb70 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
1bb80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1bb90 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
1bba0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
1bbb0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
1bbc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bbd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1bbe0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1bbf0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1bc00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
1bc10 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
1bc20 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
1bc30 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
1bc40 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
1bc50 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
1bc60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1bc70 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1bc80 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
1bc90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1bca0 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
1bcb0 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
1bcc0 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
1bcd0 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
1bce0 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
1bcf0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1bd00 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1bd10 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1bd20 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1bd30 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1bd40 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1bd50 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1bd60 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1bd70 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1bd80 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1bd90 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1bda0 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1bdb0 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1bdc0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1bdd0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1bde0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1bdf0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1be00 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1be10 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1be20 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1be30 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
1be40 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1be50 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1be60 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1be70 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
1be80 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
1be90 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1bea0 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1beb0 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66   fd>=0 ){.#ifdef
1bec0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
1bed0 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
1bee0 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
1bef0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
1bf00 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
1bf10 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28  .      OSTRACE3(
1bf20 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1bf30 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1bf40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
1bf50 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
1bf60 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
1bf70 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54  E_OK:SQLITE_CANT
1bf80 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OPEN);.}../*.** 
1bf90 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
1bfa0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
1bfb0 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
1bfc0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
1bfd0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1bfe0 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
1bff0 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
1c000 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
1c010 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
1c020 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
1c030 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
1c040 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1c050 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
1c060 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1c070 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
1c080 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
1c090 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
1c0a0 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
1c0b0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
1c0c0 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74    ".",.  };.  st
1c0d0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1c0e0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
1c0f0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
1c100 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
1c110 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
1c120 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
1c130 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
1c140 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
1c150 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  ed int i, j;.  s
1c160 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1c170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1c180 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20  ir = ".";..  /* 
1c190 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1c1a0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1c1b0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1c1c0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1c1d0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1c1e0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1c1f0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1c200 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1c210 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1c220 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
1c230 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
1c240 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1c250 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
1c260 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
1c270 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1c280 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c 20  ory;.  if (NULL 
1c290 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b 0a  == azDirs[1]) {.
1c2a0 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20      azDirs[1] = 
1c2b0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
1c2c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28 69  ;.  }.  .  for(i
1c2d0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
1c2e0 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
1c2f0 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  rs[0]); i++){.  
1c300 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d    if( azDirs[i]=
1c310 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1c320 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69     if( stat(azDi
1c330 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63  rs[i], &buf) ) c
1c340 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1c350 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
1c360 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
1c370 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73  e;.    if( acces
1c380 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29  s(azDirs[i], 07)
1c390 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c3a0 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69   zDir = azDirs[i
1c3b0 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
1c3c0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
1c3d0 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
1c3e0 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
1c3f0 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
1c400 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
1c410 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
1c420 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
1c430 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
1c440 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
1c450 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
1c460 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1c470 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28  EFIX) + 17) >= (
1c480 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
1c490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c4a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
1c4b0 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
1c4c0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c  nprintf(nBuf-17,
1c4d0 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
1c4e0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
1c4f0 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
1c500 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
1c510 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
1c520 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
1c530 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
1c540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
1c550 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
1c560 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
1c570 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
1c580 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
1c590 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
1c5a0 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
1c5b0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
1c5c0 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
1c5d0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
1c5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c5f0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1c600 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c610 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1c620 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1c630 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
1c640 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
1c650 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
1c660 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
1c670 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1c680 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
1c690 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
1c6a0 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
1c6b0 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
1c6c0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
1c6d0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
1c6e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c6f0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
1c700 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
1c710 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
1c720 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1c730 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
1c740 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
1c750 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
1c760 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
1c770 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
1c780 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
1c790 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
1c7a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
1c7b0 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
1c7c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
1c7d0 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
1c7e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
1c7f0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
1c800 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
1c810 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
1c820 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
1c830 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
1c840 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
1c850 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
1c860 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
1c870 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
1c880 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
1c890 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
1c8a0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
1c8b0 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
1c8c0 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
1c8d0 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
1c8e0 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
1c8f0 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
1c900 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
1c910 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
1c920 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
1c930 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
1c940 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
1c950 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
1c960 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
1c970 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
1c980 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
1c990 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
1c9a0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
1c9b0 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
1c9c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
1c9d0 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
1c9e0 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
1c9f0 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
1ca00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1ca10 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
1ca20 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ca30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ca40 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
1ca50 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
1ca60 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
1ca70 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
1ca80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ca90 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
1caa0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
1cab0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1cac0 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
1cad0 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
1cae0 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
1caf0 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
1cb00 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1cb10 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
1cb20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
1cb30 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
1cb40 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb60 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
1cb70 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
1cb80 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e core */.){.  i
1cb90 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cbb0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1cbc0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
1cbd0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69  en() */.  int di
1cbe0 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  rfd = -1;       
1cbf0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
1cc00 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1cc10 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  iptor */.  int o
1cc20 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
1cc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1cc40 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
1cc50 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
1cc60 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
1cc70 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
1cc80 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
1cc90 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
1cca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ccb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1ccc0 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
1ccd0 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
1cce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ccf0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
1cd00 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
1cd10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1cd20 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
1cd30 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
1cd40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1cd50 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
1cd60 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
1cd70 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
1cd80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1cd90 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
1cda0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
1cdb0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1cdc0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
1cdd0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
1cde0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1cdf0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
1ce00 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
1ce10 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
1ce20 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
1ce30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1ce40 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
1ce50 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1ce60 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
1ce70 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
1ce80 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
1ce90 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
1cea0 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1ceb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1cec0 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
1ced0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
1cee0 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
1cef0 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
1cf00 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65  ate && .      (e
1cf10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1cf20 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1cf30 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1cf40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1cf50 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  NAL).  );..  /* 
1cf60 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
1cf70 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
1cf80 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
1cf90 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
1cfa0 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
1cfb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
1cfc0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
1cfd0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1cfe0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
1cff0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
1d000 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20  X_PATHNAME+1];. 
1d010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d020 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
1d030 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
1d040 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
1d050 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
1d060 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
1d070 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
1d080 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
1d090 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
1d0a0 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
1d0b0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
1d0c0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
1d0d0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
1d0e0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
1d0f0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
1d100 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
1d110 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1d120 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1d130 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
1d140 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
1d150 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1d160 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1d170 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
1d180 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
1d190 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
1d1a0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
1d1b0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
1d1c0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
1d1d0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
1d1e0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
1d1f0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
1d200 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
1d210 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
1d220 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1d230 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
1d240 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
1d250 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
1d260 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
1d270 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
1d280 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20   deleted.  */.  
1d290 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
1d2a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1d2b0 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  DB || !isDelete 
1d2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
1d2d0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1d2e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
1d2f0 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
1d300 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
1d310 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1d320 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
1d330 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
1d340 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
1d350 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
1d360 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
1d370 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
1d380 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
1d390 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d3a0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
1d3b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1d3c0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
1d3d0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
1d3e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1d3f0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
1d400 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
1d410 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
1d420 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1d430 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1d440 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
1d450 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1d460 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
1d470 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1d480 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1d490 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d  T_DB.  );..  mem
1d4a0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
1d4b0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
1d4c0 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  ..  if( !zName )
1d4d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  {.    assert(isD
1d4e0 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
1d4f0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
1d500 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
1d510 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c  (MAX_PATHNAME+1,
1d520 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
1d530 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d540 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1d550 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d560 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
1d570 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
1d580 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
1d590 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
1d5a0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
1d5b0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
1d5c0 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
1d5d0 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
1d5e0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
1d5f0 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
1d600 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
1d610 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
1d620 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
1d630 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
1d640 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
1d650 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  ;..  fd = open(z
1d660 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
1d670 20 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53   isDelete?0600:S
1d680 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
1d690 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
1d6a0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45  .  OSTRACE4("OPE
1d6b0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
1d6c0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
1d6d0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
1d6e0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
1d6f0 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
1d700 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
1d710 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
1d720 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
1d730 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
1d740 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
1d750 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
1d760 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  /.    flags &= ~
1d770 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1d780 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1d790 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
1d7a0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1d7b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
1d7c0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f 70     return unixOp
1d7d0 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  en(pVfs, zPath, 
1d7e0 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f  pFile, flags, pO
1d7f0 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  utFlags);.  }.  
1d800 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
1d810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1d820 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66  NTOPEN;.  }.  if
1d830 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
1d840 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
1d850 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
1d860 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b  #else.    unlink
1d870 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
1d880 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
1d890 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d8a0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
1d8b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
1d8c0 65 29 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  e)->openFlags = 
1d8d0 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
1d8e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 75 74  endif.  if( pOut
1d8f0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
1d900 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
1d910 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
1d920 45 42 55 47 0a 20 20 69 66 28 20 28 66 6c 61 67  EBUG.  if( (flag
1d930 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1d940 4d 41 49 4e 5f 44 42 29 21 3d 30 20 29 7b 0a 20  MAIN_DB)!=0 ){. 
1d950 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
1d960 46 69 6c 65 29 2d 3e 69 73 4c 6f 63 6b 61 62 6c  File)->isLockabl
1d970 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 1;.  }.#endi
1d980 66 0a 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  f..  assert( fd>
1d990 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
1d9a0 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  enDirectory ){. 
1d9b0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
1d9c0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69  ctory(zPath, &di
1d9d0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1d9e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d9f0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20       close(fd); 
1da00 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
1da10 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
1da20 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
1da30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da40 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1da50 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63   FD_CLOEXEC.  fc
1da60 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
1da70 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
1da80 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
1da90 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  XEC);.#endif..  
1daa0 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
1dab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1dac0 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  _DB;..#if SQLITE
1dad0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
1dae0 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50 61 74  CKING.  if( zPat
1daf0 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f 4c 6f  h!=NULL && !noLo
1db00 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ck ){.    char *
1db10 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
1db20 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
1db30 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
1db40 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
1db50 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
1db60 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
1db70 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
1db80 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
1db90 75 73 65 20 70 72 6f 78 79 2c 20 0a 20 20 20 20  use proxy, .    
1dba0 2a 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76 65 72  ** 0 means never
1dbb0 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
1dbc0 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
1dbd0 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
1dbe0 69 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2f  iles only.    */
1dbf0 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
1dc00 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
1dc10 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
1dc20 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
1dc30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1dc40 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
1dc50 6e 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  nfo;..      if( 
1dc60 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
1dc70 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
1dc80 09 09 09 09 28 28 75 6e 69 78 46 69 6c 65 2a 29  ....((unixFile*)
1dc90 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e  pFile)->lastErrn
1dca0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1dcb0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
1dcc0 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
1dcd0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
1dce0 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
1dcf0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6c  or */.        cl
1dd00 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
1dd10 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
1dd20 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
1dd30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1dd40 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
1dd50 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  S;.      }.     
1dd60 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
1dd70 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
1dd80 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
1dd90 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
1dda0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
1ddb0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
1ddc0 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46  s, fd, dirfd, pF
1ddd0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
1dde0 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 20  ck, isDelete);. 
1ddf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1de00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1de10 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
1de20 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
1de30 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
1de40 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
1de50 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1de60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
1de70 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
1de80 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
1de90 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
1dea0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
1deb0 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
1dec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1ded0 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
1dee0 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
1def0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
1df00 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
1df10 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
1df20 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
1df30 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1df40 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
1df50 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1df60 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
1df70 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
1df80 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
1df90 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
1dfa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1dfb0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
1dfc0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
1dfd0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
1dfe0 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
1dff0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1e000 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
1e010 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
1e020 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
1e030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e040 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
1e050 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1e060 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1e070 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
1e080 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
1e090 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29  .  unlink(zPath)
1e0a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e0b0 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
1e0c0 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
1e0d0 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
1e0e0 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
1e0f0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
1e100 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
1e120 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
1e130 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
1e140 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
1e150 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
1e160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1e170 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e180 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
1e190 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
1e1a0 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26    if( close(fd)&
1e1b0 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  &!rc ){.        
1e1c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1e1d0 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
1e1e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1e1f0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
1e200 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
1e210 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
1e220 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
1e230 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
1e240 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
1e250 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
1e260 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
1e270 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
1e280 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
1e290 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
1e2a0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
1e2b0 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
1e2c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
1e2d0 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
1e2e0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
1e2f0 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
1e300 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
1e310 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
1e320 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
1e330 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
1e340 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
1e350 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
1e360 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e370 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
1e380 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
1e390 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
1e3a0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
1e3b0 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
1e3c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1e3d0 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
1e3e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
1e3f0 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
1e400 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1e410 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
1e420 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
1e430 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
1e440 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
1e450 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
1e460 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
1e470 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
1e480 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
1e490 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
1e4a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1e4b0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
1e4c0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1e4d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
1e4e0 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
1e4f0 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
1e500 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
1e510 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
1e520 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
1e530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1e540 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
1e550 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
1e560 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
1e570 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
1e580 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1e590 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
1e5a0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
1e5b0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
1e5c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1e5d0 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
1e5e0 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
1e5f0 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
1e600 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28  esOut = (access(
1e610 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
1e620 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e630 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1e640 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
1e650 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
1e660 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
1e670 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
1e680 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
1e690 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
1e6a0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
1e6b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1e6c0 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
1e6d0 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
1e6e0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
1e6f0 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
1e700 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
1e710 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
1e720 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
1e730 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
1e740 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
1e750 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
1e760 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
1e770 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1e780 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1e790 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
1e7a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1e7c0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
1e7d0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
1e7e0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
1e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
1e800 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
1e810 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
1e820 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e840 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
1e850 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
1e860 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
1e890 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
1e8a0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
1e8b0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
1e8c0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
1e8d0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
1e8e0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
1e8f0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
1e900 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
1e910 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
1e920 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1e930 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
1e940 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
1e950 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
1e960 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
1e970 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
1e980 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1e990 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
1e9a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e9b0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1e9c0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
1e9d0 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
1e9e0 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
1e9f0 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
1ea00 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ea10 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
1ea20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
1ea30 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
1ea40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1ea50 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
1ea60 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
1ea70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ea80 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67   nCwd;.    if( g
1ea90 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
1eaa0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
1eab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1eac0 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20  NTOPEN;.    }.  
1ead0 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74    nCwd = (int)st
1eae0 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20  rlen(zOut);.    
1eaf0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1eb00 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75  (nOut-nCwd, &zOu
1eb10 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20  t[nCwd], "/%s", 
1eb20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65  zPath);.  }.  re
1eb30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eb40 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1eb50 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1eb60 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
1eb70 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
1eb80 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
1eb90 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
1eba0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
1ebb0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
1ebc0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
1ebd0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
1ebe0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
1ebf0 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
1ec00 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
1ec10 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
1ec20 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
1ec30 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1ec40 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
1ec50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1ec60 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
1ec70 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
1ec80 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
1ec90 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
1eca0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
1ecb0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
1ecc0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
1ecd0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
1ece0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
1ecf0 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
1ed00 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
1ed10 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
1ed20 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
1ed30 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
1ed40 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
1ed50 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
1ed60 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
1ed70 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
1ed80 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
1ed90 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
1eda0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
1edb0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
1edc0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
1edd0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1ede0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
1edf0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
1ee00 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ee10 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a  ufOut){.  char *
1ee20 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
1ee30 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1ee40 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
1ee50 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
1ee60 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
1ee70 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
1ee80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1ee90 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
1eea0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
1eeb0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1eec0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1eed0 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
1eee0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
1eef0 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
1ef00 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
1ef10 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
1ef20 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
1ef30 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
1ef40 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
1ef50 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
1ef60 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
1ef70 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
1ef80 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
1ef90 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
1efa0 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
1efb0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
1efc0 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
1efd0 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
1efe0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
1eff0 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
1f000 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
1f010 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
1f020 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
1f030 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
1f040 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
1f050 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1f060 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
1f070 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
1f080 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
1f090 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
1f0a0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
1f0b0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
1f0c0 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
1f0d0 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
1f0e0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
1f0f0 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
1f100 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
1f110 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
1f120 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
1f130 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
1f140 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
1f150 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
1f160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1f170 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
1f180 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
1f190 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
1f1a0 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
1f1b0 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
1f1c0 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
1f1d0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
1f1e0 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
1f1f0 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
1f200 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
1f210 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
1f220 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
1f230 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
1f240 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
1f250 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
1f260 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
1f270 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
1f280 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
1f290 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f2a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1f2b0 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
1f2c0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
1f2d0 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
1f2e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
1f2f0 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
1f300 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
1f310 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
1f320 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
1f330 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
1f340 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1f350 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
1f360 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
1f370 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
1f380 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1f390 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
1f3a0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
1f3b0 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
1f3c0 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
1f3d0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
1f3e0 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
1f3f0 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
1f400 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1f410 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
1f420 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
1f430 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1f440 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
1f450 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1f460 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
1f470 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1f480 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1f490 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
1f4a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1f4b0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
1f4c0 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
1f4d0 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
1f4e0 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
1f4f0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
1f500 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
1f510 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
1f520 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
1f530 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
1f540 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
1f550 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
1f560 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
1f570 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
1f580 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
1f590 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
1f5a0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
1f5b0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
1f5c0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
1f5d0 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
1f5e0 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
1f5f0 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
1f600 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
1f610 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
1f620 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
1f630 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
1f640 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
1f650 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
1f660 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
1f670 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
1f680 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
1f690 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
1f6a0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
1f6b0 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
1f6c0 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
1f6d0 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
1f6e0 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
1f6f0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
1f700 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
1f710 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
1f720 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
1f730 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
1f740 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
1f750 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
1f760 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
1f770 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
1f780 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1f790 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
1f7a0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f  , fd;.    fd = o
1f7b0 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
1f7c0 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  m", O_RDONLY);. 
1f7d0 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
1f7e0 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
1f7f0 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
1f800 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1f810 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
1f820 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
1f830 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
1f840 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
1f850 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
1f860 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
1f870 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1f880 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
1f890 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
1f8a0 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
1f8b0 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
1f8c0 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
1f8d0 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72 65  .      nBuf = re
1f8e0 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
1f8f0 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  f);.      close(
1f900 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  fd);.    }.  }.#
1f910 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
1f920 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
1f930 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1f940 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1f950 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1f960 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
1f970 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1f980 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
1f990 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
1f9a0 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
1f9b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f9c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f9d0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
1f9e0 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
1f9f0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
1fa00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1fa10 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1fa20 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
1fa30 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
1fa40 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1fa50 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
1fa60 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
1fa70 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
1fa80 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
1fa90 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
1faa0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1fab0 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
1fac0 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
1fad0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1fae0 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
1faf0 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
1fb00 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
1fb10 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
1fb20 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
1fb30 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
1fb40 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
1fb50 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
1fb60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1fb70 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1fb80 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
1fb90 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
1fba0 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
1fbb0 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
1fbc0 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
1fbd0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1fbe0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1fbf0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
1fc00 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
1fc10 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
1fc20 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
1fc30 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
1fc40 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
1fc50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1fc60 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1fc70 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
1fc80 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
1fc90 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1fca0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
1fcb0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
1fcc0 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
1fcd0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
1fce0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
1fcf0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
1fd00 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
1fd10 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1fd20 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
1fd30 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
1fd40 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
1fd50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1fd60 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
1fd70 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
1fd80 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
1fd90 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
1fda0 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
1fdb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
1fdc0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1fdd0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
1fde0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
1fdf0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
1fe00 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
1fe10 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
1fe20 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
1fe30 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
1fe40 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
1fe50 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
1fe60 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
1fe70 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
1fe80 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
1fe90 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
1fea0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75  fs *NotUsed, dou
1feb0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66  ble *prNow){.#if
1fec0 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
1fed0 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
1fee0 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
1fef0 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30  rNow = t/86400.0
1ff00 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65   + 2440587.5;.#e
1ff10 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  lif OS_VXWORKS. 
1ff20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
1ff30 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67   sNow;.  clock_g
1ff40 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41  ettime(CLOCK_REA
1ff50 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20  LTIME, &sNow);. 
1ff60 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
1ff70 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
1ff80 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
1ff90 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30 30  .tv_nsec/8640000
1ffa0 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73 65  0000000.0;.#else
1ffb0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
1ffc0 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
1ffd0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
1ffe0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
1fff0 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
20000 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
20010 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30  Now.tv_usec/8640
20020 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69  0000000.0;.#endi
20030 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
20040 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
20050 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
20060 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
20070 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
20080 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
20090 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
200a0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
200b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
200c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
200d0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
200e0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
200f0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
20100 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
20110 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
20120 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
20130 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
20140 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
20150 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
20160 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
20170 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
20180 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
20190 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
201a0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
201b0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
201c0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
201d0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
201e0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
201f0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
20200 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
20210 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
20220 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
20230 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
20240 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
20250 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
20260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20270 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
20280 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20290 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
202a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
202b0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
202c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a  rn 0;.}../*.****
202d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202e0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
202f0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
20300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
20320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
20370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
203a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
203b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
203c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
203d0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
203e0 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
203f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
20410 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
20420 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
20430 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
20440 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
20450 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
20460 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
20470 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
20480 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
20490 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
204a0 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
204b0 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
204c0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
204d0 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
204e0 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
204f0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
20500 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
20510 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
20520 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
20530 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
20540 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
20550 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
20560 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
20570 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
20580 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
20590 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
205a0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
205b0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
205c0 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
205d0 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
205e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
205f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
20600 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
20610 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
20620 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
20630 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
20640 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
20650 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
20660 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
20670 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
20680 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
20690 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
206a0 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
206b0 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
206c0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
206d0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
206e0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
206f0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
20700 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
20710 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
20720 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
20730 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
20740 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
20750 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
20760 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
20770 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
20780 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
20790 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
207a0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
207b0 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
207c0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
207d0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
207e0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
207f0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
20800 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
20810 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
20820 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
20830 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
20840 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
20850 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
20860 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
20870 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
20880 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
20890 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
208a0 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
208b0 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
208c0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
208d0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
208e0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
208f0 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a  0000000..   ..**
20900 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
20910 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
20920 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
20930 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
20940 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
20950 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
20960 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
20970 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
20980 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
20990 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
209a0 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
209b0 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
209c0 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
209d0 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
209e0 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
209f0 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
20a00 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
20a10 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
20a20 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
20a30 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
20a40 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
20a50 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
20a60 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
20a70 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
20a80 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
20a90 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
20aa0 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
20ab0 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
20ac0 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
20ad0 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
20ae0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
20af0 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
20b00 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
20b10 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
20b20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
20b30 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
20b40 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
20b50 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
20b60 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
20b70 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
20b80 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
20b90 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
20ba0 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
20bb0 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
20bc0 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
20bd0 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
20be0 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
20bf0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
20c00 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
20c10 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
20c20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
20c30 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
20c40 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
20c50 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
20c60 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
20c70 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
20c80 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
20c90 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
20ca0 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
20cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
20cc0 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
20cd0 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
20ce0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
20cf0 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
20d00 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
20d10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
20d20 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
20d30 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
20d40 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
20d50 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53  dbname, SQLITE_S
20d60 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
20d70 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
20d80 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
20d90 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
20da0 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
20db0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
20dc0 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
20dd0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
20de0 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68  LE, &<proxy_path
20df0 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
20e00 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
20e10 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
20e20 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
20e30 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
20e40 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
20e50 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
20e60 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
20e70 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
20e80 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
20e90 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
20ea0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
20eb0 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
20ec0 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
20ed0 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
20ee0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
20ef0 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
20f00 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
20f10 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
20f20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
20f30 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
20f40 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
20f50 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
20f60 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
20f70 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
20f80 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
20f90 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
20fa0 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
20fb0 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
20fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20fd0 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
20fe0 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
20ff0 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
21000 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
21010 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
21020 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
21030 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
21040 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
21050 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
21060 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
21070 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
21080 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
21090 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
210a0 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
210b0 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
210c0 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
210d0 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
210e0 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
210f0 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
21100 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
21110 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
21120 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
21130 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
21140 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
21150 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
21160 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
21170 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
21180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21190 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
211a0 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
211b0 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
211c0 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
211d0 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
211e0 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
211f0 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
21200 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21210 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
21220 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
21230 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
21240 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
21250 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
21260 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
21270 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
21280 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
21290 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
212a0 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
212b0 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
212c0 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
212d0 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
212e0 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
212f0 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
21300 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
21310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
21320 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
21330 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
21340 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
21350 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
21360 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
21370 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
21380 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
21390 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
213a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
213b0 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
213c0 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
213d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
213e0 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
213f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21400 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
21410 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
21420 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
21430 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
21440 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
21450 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
21460 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
21470 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
21480 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  t's contents do 
21490 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
214a0 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
214b0 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
214c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
214d0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
214e0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
214f0 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
21500 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
21510 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
21520 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
21530 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
21540 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
21550 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
21560 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
21570 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
21580 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
21590 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
215a0 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
215b0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
215c0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
215d0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
215e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
215f0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
21600 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
21610 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
21620 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
21630 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
21640 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
21650 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
21660 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
21670 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
21680 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21690 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
216a0 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
216b0 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
216c0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
216d0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
216e0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
216f0 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
21700 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
21710 54 68 65 72 65 20 69 73 20 61 20 74 68 69 72 64  There is a third
21720 20 66 69 6c 65 20 2d 20 74 68 65 20 68 6f 73 74   file - the host
21730 20 49 44 20 66 69 6c 65 20 2d 20 75 73 65 64 20   ID file - used 
21740 61 73 20 61 20 70 65 72 73 69 73 74 65 6e 74 20  as a persistent 
21750 72 65 63 6f 72 64 0a 2a 2a 20 6f 66 20 61 20 75  record.** of a u
21760 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72  nique identifier
21770 20 66 6f 72 20 74 68 65 20 68 6f 73 74 2c 20 61   for the host, a
21780 20 31 32 38 2d 62 79 74 65 20 75 6e 69 71 75 65   128-byte unique
21790 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
217a0 20 69 6e 20 74 68 65 20 70 61 74 68 20 64 65 66   in the path def
217b0 69 6e 65 64 20 62 79 20 74 68 65 20 48 4f 53 54  ined by the HOST
217c0 49 44 50 41 54 48 20 6d 61 63 72 6f 20 28 64 65  IDPATH macro (de
217d0 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 0a 2a  fault value is.*
217e0 2a 20 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65  * /Library/Cache
217f0 73 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c  s/.com.apple.sql
21800 69 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 29 2e  iteConchHostId).
21810 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
21820 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
21830 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
21840 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
21850 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
21860 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
21870 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
21880 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
21890 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
218a0 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
218b0 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
218c0 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
218d0 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
218e0 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
218f0 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
21900 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
21910 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
21920 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
21930 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
21940 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
21950 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
21960 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
21970 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
21980 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
21990 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
219a0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
219b0 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
219c0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
219d0 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
219e0 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
219f0 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
21a00 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
21a10 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
21a20 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
21a30 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
21a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a50 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
21a60 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
21a70 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
21a80 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
21a90 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
21aa0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
21ab0 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
21ac0 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
21ad0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
21ae0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
21af0 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
21b00 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
21b10 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
21b20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
21b30 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
21b40 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
21b50 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
21b60 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
21b70 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
21b80 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
21b90 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
21ba0 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
21bb0 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
21bc0 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
21bd0 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
21be0 2a 0a 2a 2a 20 20 48 4f 53 54 49 44 50 41 54 48  *.**  HOSTIDPATH
21bf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
21c00 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
21c10 6c 74 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  lt host ID file 
21c20 70 61 74 68 20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  path location.**
21c30 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
21c40 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
21c50 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
21c60 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
21c70 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
21c80 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
21c90 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
21ca0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
21cb0 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
21cc0 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
21cd0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
21ce0 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
21cf0 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
21d00 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
21d10 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
21d20 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
21d30 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
21d40 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
21d50 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
21d60 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
21d70 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
21d80 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
21d90 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
21da0 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
21db0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
21dc0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
21dd0 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
21de0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
21df0 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
21e00 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
21e10 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
21e20 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
21e30 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
21e40 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
21e50 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
21e60 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
21e70 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
21e80 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
21e90 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
21ea0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21eb0 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
21ec0 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
21ed0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
21ee0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
21ef0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
21f00 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
21f10 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
21f20 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
21f30 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
21f40 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
21f50 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
21f60 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
21f70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
21f80 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
21f90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
21fa0 53 54 59 4c 45 0a 0a 23 69 66 64 65 66 20 53 51  STYLE..#ifdef SQ
21fb0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
21fc0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
21fd0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
21fe0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
21ff0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
22000 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
22010 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
22020 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
22030 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
22040 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
22050 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
22060 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
22070 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
22080 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
22090 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
220a0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
220b0 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
220c0 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
220d0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
220e0 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
220f0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
22100 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
22110 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nch file */.  ch
22120 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74  ar *conchFilePat
22130 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
22140 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
22150 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
22160 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20  le *lockProxy;  
22170 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
22180 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
22190 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72  /.  char *lockPr
221a0 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20  oxyPath;        
221b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
221c0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
221d0 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  */.  char *dbPat
221e0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
221f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22200 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
22210 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20  int conchHeld;  
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22230 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 63  True if the conc
22240 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68  h is currently h
22250 65 6c 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  eld */.  void *o
22260 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
22270 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
22280 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
22290 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
222a0 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
222b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
222c0 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
222d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
222e0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
222f0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
22300 48 4f 53 54 49 44 4c 45 4e 20 61 6e 64 20 43 4f  HOSTIDLEN and CO
22310 4e 43 48 4c 45 4e 20 62 6f 74 68 20 69 6e 63 6c  NCHLEN both incl
22320 75 64 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ude space for th
22330 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20 74 65 72  e string .** ter
22340 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 20 0a 2a 2f  minating nul .*/
22350 0a 23 64 65 66 69 6e 65 20 48 4f 53 54 49 44 4c  .#define HOSTIDL
22360 45 4e 20 20 20 20 20 20 20 20 20 31 32 38 0a 23  EN         128.#
22370 64 65 66 69 6e 65 20 43 4f 4e 43 48 4c 45 4e 20  define CONCHLEN 
22380 20 20 20 20 20 20 20 20 20 28 4d 41 58 50 41 54           (MAXPAT
22390 48 4c 45 4e 2b 48 4f 53 54 49 44 4c 45 4e 2b 31  HLEN+HOSTIDLEN+1
223a0 29 0a 23 69 66 6e 64 65 66 20 48 4f 53 54 49 44  ).#ifndef HOSTID
223b0 50 41 54 48 0a 23 20 64 65 66 69 6e 65 20 48 4f  PATH.# define HO
223c0 53 54 49 44 50 41 54 48 20 20 20 20 20 20 20 22  STIDPATH       "
223d0 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65 73 2f  /Library/Caches/
223e0 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c 69 74  .com.apple.sqlit
223f0 65 43 6f 6e 63 68 48 6f 73 74 49 64 22 0a 23 65  eConchHostId".#e
22400 6e 64 69 66 0a 0a 2f 2a 20 62 61 73 69 63 61 6c  ndif../* basical
22410 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 75 6e 69  ly a copy of uni
22420 78 52 61 6e 64 6f 6d 6e 65 73 73 20 77 69 74 68  xRandomness with
22430 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 74 65   different.** te
22440 73 74 20 62 65 68 61 76 69 6f 72 20 62 75 69 6c  st behavior buil
22450 74 20 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  t in */.static i
22460 6e 74 20 70 72 6f 78 79 47 65 6e 65 72 61 74 65  nt proxyGenerate
22470 48 6f 73 74 49 44 28 63 68 61 72 20 2a 70 48 6f  HostID(char *pHo
22480 73 74 49 44 29 7b 0a 20 20 69 6e 74 20 70 69 64  stID){.  int pid
22490 2c 20 66 64 2c 20 6c 65 6e 3b 0a 20 20 75 6e 73  , fd, len;.  uns
224a0 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
224b0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
224c0 20 2a 29 70 48 6f 73 74 49 44 3b 0a 20 20 0a 20   *)pHostID;.  . 
224d0 20 6d 65 6d 73 65 74 28 6b 65 79 2c 20 30 2c 20   memset(key, 0, 
224e0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 6c 65  HOSTIDLEN);.  le
224f0 6e 20 3d 20 30 3b 0a 20 20 66 64 20 3d 20 6f 70  n = 0;.  fd = op
22500 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
22510 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  ", O_RDONLY);.  
22520 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
22530 20 6c 65 6e 20 3d 20 72 65 61 64 28 66 64 2c 20   len = read(fd, 
22540 6b 65 79 2c 20 48 4f 53 54 49 44 4c 45 4e 29 3b  key, HOSTIDLEN);
22550 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20  .    close(fd); 
22560 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
22570 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66 61   the fd if it fa
22580 69 6c 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ils */.  }.  if(
22590 20 6c 65 6e 20 3c 20 48 4f 53 54 49 44 4c 45 4e   len < HOSTIDLEN
225a0 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f 74 20 74   ){.    time_t t
225b0 3b 0a 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a  ;.    time(&t);.
225c0 20 20 20 20 6d 65 6d 63 70 79 28 6b 65 79 2c 20      memcpy(key, 
225d0 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
225e0 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
225f0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
22600 6b 65 79 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  key[sizeof(t)], 
22610 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
22620 29 29 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 64 65  ));.  }.  .#ifde
22630 66 20 4d 41 4b 45 5f 50 52 45 54 54 59 5f 48 4f  f MAKE_PRETTY_HO
22640 53 54 49 44 0a 20 20 7b 0a 20 20 20 20 69 6e 74  STID.  {.    int
22650 20 69 3b 0a 20 20 20 20 2f 2a 20 66 69 6c 74 65   i;.    /* filte
22660 72 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  r the bytes into
22670 20 70 72 69 6e 74 61 62 6c 65 20 61 73 63 69 69   printable ascii
22680 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20   characters and 
22690 4e 55 4c 20 74 65 72 6d 69 6e 61 74 65 20 2a 2f  NUL terminate */
226a0 0a 20 20 20 20 6b 65 79 5b 28 48 4f 53 54 49 44  .    key[(HOSTID
226b0 4c 45 4e 2d 31 29 5d 20 3d 20 30 78 30 30 3b 0a  LEN-1)] = 0x00;.
226c0 20 20 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c      for( i=0; i<
226d0 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 3b 20 69  (HOSTIDLEN-1); i
226e0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  ++ ){.      unsi
226f0 67 6e 65 64 20 63 68 61 72 20 70 61 20 3d 20 6b  gned char pa = k
22700 65 79 5b 69 5d 26 30 78 37 46 3b 0a 20 20 20 20  ey[i]&0x7F;.    
22710 20 20 69 66 28 20 70 61 3c 30 78 32 30 20 29 7b    if( pa<0x20 ){
22720 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d 20  .        key[i] 
22730 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d  = (key[i]&0x80 =
22740 3d 20 30 78 38 30 29 20 3f 20 70 61 2b 30 78 34  = 0x80) ? pa+0x4
22750 30 20 3a 20 70 61 2b 30 78 32 30 3b 0a 20 20 20  0 : pa+0x20;.   
22760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61 3d     }else if( pa=
22770 3d 30 78 37 46 20 29 7b 0a 20 20 20 20 20 20 20  =0x7F ){.       
22780 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b 69   key[i] = (key[i
22790 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29 20  ]&0x80 == 0x80) 
227a0 3f 20 70 61 3d 30 78 32 30 20 3a 20 70 61 2b 30  ? pa=0x20 : pa+0
227b0 78 37 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x7E;.      }.   
227c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
227d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
227e0 3b 0a 7d 0a 0a 2f 2a 20 77 72 69 74 65 73 20 74  ;.}../* writes t
227f0 68 65 20 68 6f 73 74 20 69 64 20 70 61 74 68 20  he host id path 
22800 74 6f 20 70 61 74 68 2c 20 70 61 74 68 20 73 68  to path, path sh
22810 6f 75 6c 64 20 62 65 20 61 6e 20 70 72 65 2d 61  ould be an pre-a
22820 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 0a  llocated buffer.
22830 2a 2a 20 77 69 74 68 20 65 6e 6f 75 67 68 20 73  ** with enough s
22840 70 61 63 65 20 66 6f 72 20 61 20 70 61 74 68 20  pace for a path 
22850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22860 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 50 61  proxyGetHostIDPa
22870 74 68 28 63 68 61 72 20 2a 70 61 74 68 2c 20 73  th(char *path, s
22880 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20 20 73 74  ize_t len){.  st
22890 72 6c 63 70 79 28 70 61 74 68 2c 20 48 4f 53 54  rlcpy(path, HOST
228a0 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b 0a 23 69  IDPATH, len);.#i
228b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
228c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
228d0 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29 7b 0a 20  ostid_num>0 ){. 
228e0 20 20 20 63 68 61 72 20 73 75 66 66 69 78 5b 32     char suffix[2
228f0 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73 75 66  ] = "1";.    suf
22900 66 69 78 5b 30 5d 20 3d 20 73 75 66 66 69 78 5b  fix[0] = suffix[
22910 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f 68 6f 73  0] + sqlite3_hos
22920 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20 73 74 72  tid_num;.    str
22930 6c 63 61 74 28 70 61 74 68 2c 20 73 75 66 66 69  lcat(path, suffi
22940 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e  x, len);.  }.#en
22950 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33 28 22  dif.  OSTRACE3("
22960 47 45 54 48 4f 53 54 49 44 50 41 54 48 20 20 25  GETHOSTIDPATH  %
22970 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 61 74  s pid=%d\n", pat
22980 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 7d 0a  h, getpid());.}.
22990 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
229a0 20 49 44 20 66 72 6f 6d 20 61 20 73 71 6c 69 74   ID from a sqlit
229b0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 73 74  e hostid file st
229c0 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ored in the .** 
229d0 75 73 65 72 2d 73 70 65 63 69 66 69 63 20 74 6d  user-specific tm
229e0 70 20 64 69 72 65 63 74 6f 72 79 2c 20 63 72 65  p directory, cre
229f0 61 74 65 20 74 68 65 20 49 44 20 69 66 20 69 74  ate the ID if it
22a00 27 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  's not there alr
22a10 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74 69 63 20  eady .*/.static 
22a20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
22a30 49 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ID(char *pHostID
22a40 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
22a50 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
22a60 20 70 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e   path[MAXPATHLEN
22a70 5d 3b 20 0a 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ]; .  size_t len
22a80 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c 49 54  ;.  int rc=SQLIT
22a90 45 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 78 79 47 65  E_OK;..  proxyGe
22aa0 74 48 6f 73 74 49 44 50 61 74 68 28 70 61 74 68  tHostIDPath(path
22ab0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
22ac0 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
22ad0 65 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69  e the host ID fi
22ae0 6c 65 2c 20 69 66 20 69 74 20 61 6c 72 65 61 64  le, if it alread
22af0 79 20 65 78 69 73 74 73 20 72 65 61 64 20 74 68  y exists read th
22b00 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
22b10 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
22b20 4f 5f 43 52 45 41 54 7c 4f 5f 57 52 4f 4e 4c 59  O_CREAT|O_WRONLY
22b30 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34 29 3b 0a  |O_EXCL, 0644);.
22b40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
22b50 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
22b60 0a 09 09 0a 20 20 20 20 69 66 28 20 65 72 72 21  ....    if( err!
22b70 3d 45 45 58 49 53 54 20 29 7b 0a 23 69 66 64 65  =EEXIST ){.#ifde
22b80 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44  f SQLITE_PROXY_D
22b90 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20  EBUG /* set the 
22ba0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73  sqlite error mes
22bb0 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a  sage instead */.
22bc0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
22bd0 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72  derr, "sqlite er
22be0 72 6f 72 20 63 72 65 61 74 69 6e 67 20 68 6f 73  ror creating hos
22bf0 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73  t ID file %s: %s
22c00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22c10 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f     path, strerro
22c20 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a  r(err));.#endif.
22c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22c40 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a  ITE_PERM;.    }.
22c50 20 20 20 20 2f 2a 20 63 6f 75 6c 64 6e 27 74 20      /* couldn't 
22c60 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
22c70 20 72 65 61 64 20 69 74 20 69 6e 73 74 65 61 64   read it instead
22c80 20 2a 2f 0a 20 20 20 20 66 64 20 3d 20 6f 70 65   */.    fd = ope
22c90 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59  n(path, O_RDONLY
22ca0 7c 4f 5f 45 58 43 4c 29 3b 0a 20 20 20 20 69 66  |O_EXCL);.    if
22cb0 28 20 66 64 3c 30 20 29 7b 0a 23 69 66 64 65 66  ( fd<0 ){.#ifdef
22cc0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
22cd0 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20 73  BUG /* set the s
22ce0 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  qlite error mess
22cf0 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20  age instead */. 
22d00 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
22d10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 66 70 72 69  rrno;.      fpri
22d20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
22d30 69 74 65 20 65 72 72 6f 72 20 6f 70 65 6e 69 6e  ite error openin
22d40 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20 25  g host ID file %
22d50 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s: %s\n",.      
22d60 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 73 74          path, st
22d70 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 23 65  rerror(err));.#e
22d80 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
22d90 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
22da0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 70     }.    len = p
22db0 72 65 61 64 28 66 64 2c 20 70 48 6f 73 74 49 44  read(fd, pHostID
22dc0 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29 3b  , HOSTIDLEN, 0);
22dd0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29  .    if( len<0 )
22de0 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
22df0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
22e00 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22e10 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65  _READ;.    }else
22e20 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44 4c   if( len<HOSTIDL
22e30 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  EN ){.      *pEr
22e40 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ror = 0;.      r
22e50 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22e60 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 20  _SHORT_READ;.   
22e70 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29   }.    close(fd)
22e80 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
22e90 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20  ak the fd if it 
22ea0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54  fails */.    OST
22eb0 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44  RACE3("GETHOSTID
22ec0 20 20 72 65 61 64 20 25 73 20 70 69 64 3d 25 64    read %s pid=%d
22ed0 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65  \n", pHostID, ge
22ee0 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74  tpid());.    ret
22ef0 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  urn rc;.  }else{
22f00 0a 20 20 20 20 2f 2a 20 77 65 27 72 65 20 63 72  .    /* we're cr
22f10 65 61 74 69 6e 67 20 74 68 65 20 68 6f 73 74 20  eating the host 
22f20 49 44 20 66 69 6c 65 20 28 75 73 65 20 61 20 72  ID file (use a r
22f30 61 6e 64 6f 6d 20 73 74 72 69 6e 67 20 6f 66 20  andom string of 
22f40 62 79 74 65 73 29 20 2a 2f 0a 20 20 20 20 70 72  bytes) */.    pr
22f50 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49  oxyGenerateHostI
22f60 44 28 70 48 6f 73 74 49 44 29 3b 0a 20 20 20 20  D(pHostID);.    
22f70 6c 65 6e 20 3d 20 70 77 72 69 74 65 28 66 64 2c  len = pwrite(fd,
22f80 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49 44   pHostID, HOSTID
22f90 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  LEN, 0);.    if(
22fa0 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
22fb0 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b  *pError = errno;
22fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22fd0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
22fe0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
22ff0 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  n<HOSTIDLEN ){. 
23000 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30       *pError = 0
23010 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
23020 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
23030 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
23040 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
23050 79 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69 66  y leak the fd if
23060 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20   it fails */.   
23070 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48 4f   OSTRACE3("GETHO
23080 53 54 49 44 20 20 77 72 6f 74 65 20 25 73 20 70  STID  wrote %s p
23090 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f 73 74 49  id=%d\n", pHostI
230a0 44 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  D, getpid());.  
230b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
230c0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
230d0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
230e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
230f0 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
23100 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b   size_t maxLen){
23110 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
23120 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69  t dbLen;.  int i
23130 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52  ;..#ifdef LOCKPR
23140 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73  OXYDIR.  len = s
23150 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f  trlcpy(lPath, LO
23160 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c  CKPROXYDIR, maxL
23170 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  en);.#else.# ifd
23180 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  ef _CS_DARWIN_US
23190 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a  ER_TEMP_DIR.  {.
231a0 20 20 20 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f      confstr(_CS_
231b0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
231c0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
231d0 4c 65 6e 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  Len);.    len = 
231e0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
231f0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
23200 61 78 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  axLen);.    if( 
23210 6d 6b 64 69 72 28 6c 50 61 74 68 2c 20 53 51 4c  mkdir(lPath, SQL
23220 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
23230 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
23240 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  ) ){.      /* if
23250 20 6d 6b 64 69 72 20 66 61 69 6c 73 2c 20 68 61   mkdir fails, ha
23260 6e 64 6c 65 20 61 73 20 6c 6f 63 6b 20 66 69 6c  ndle as lock fil
23270 65 20 63 72 65 61 74 69 6f 6e 20 66 61 69 6c 75  e creation failu
23280 72 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  re */.      int 
23290 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 23 20 20  err = errno;.#  
232a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
232b0 55 47 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  UG.      if( err
232c0 21 3d 45 45 58 49 53 54 20 29 7b 0a 20 20 20 20  !=EEXIST ){.    
232d0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
232e0 72 72 2c 20 22 70 72 6f 78 79 47 65 74 4c 6f 63  rr, "proxyGetLoc
232f0 6b 50 61 74 68 3a 20 6d 6b 64 69 72 28 25 73 2c  kPath: mkdir(%s,
23300 30 25 6f 29 20 65 72 72 6f 72 20 25 64 20 25 73  0%o) error %d %s
23310 5c 6e 22 2c 20 6c 50 61 74 68 2c 0a 20 20 20 20  \n", lPath,.    
23320 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
23330 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
23340 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2c  DIR_PERMISSIONS,
23350 20 65 72 72 2c 20 73 74 72 65 72 72 6f 72 28 65   err, strerror(e
23360 72 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 20  rr));.      }.# 
23370 20 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65   endif.    }else
23380 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  {.      OSTRACE3
23390 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 6d  ("GETLOCKPATH  m
233a0 6b 64 69 72 20 25 73 20 70 69 64 3d 25 64 5c 6e  kdir %s pid=%d\n
233b0 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64  ", lPath, getpid
233c0 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  ());.    }.    .
233d0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
233e0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
233f0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
23400 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
23410 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
23420 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
23430 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
23440 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
23450 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
23460 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
23470 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
23480 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
23490 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
234a0 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
234b0 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
234c0 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
234d0 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  )<maxLen; i++){.
234e0 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
234f0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
23500 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
23510 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
23520 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
23530 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
23540 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
23550 61 78 4c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  axLen);.  return
23560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23570 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
23580 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
23590 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
235a0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
235b0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
235c0 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
235d0 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
235e0 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
235f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
23600 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
23610 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
23620 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
23630 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
23640 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
23650 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
23660 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
23670 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
23680 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
23690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
236a0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
236b0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  le(const char *p
236c0 61 74 68 2c 20 75 6e 69 78 46 69 6c 65 20 2a 2a  ath, unixFile **
236d0 70 70 46 69 6c 65 29 20 7b 0a 20 20 69 6e 74 20  ppFile) {.  int 
236e0 66 64 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20  fd;.  int dirfd 
236f0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
23700 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
23710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23720 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
23730 79 56 66 73 3b 0a 0a 20 20 66 64 20 3d 20 6f 70  yVfs;..  fd = op
23740 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 57 52 20  en(path, O_RDWR 
23750 7c 20 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54  | O_CREAT, SQLIT
23760 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
23770 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
23780 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
23790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
237a0 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 0a 20 20  TOPEN;.  }.  .  
237b0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
237c0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
237d0 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  c(sizeof(unixFil
237e0 65 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e));.  if( pNew=
237f0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
23800 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23810 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65      goto end_cre
23820 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20  ate_proxy;.  }. 
23830 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
23840 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
23850 29 29 3b 0a 0a 20 20 64 75 6d 6d 79 56 66 73 2e  ));..  dummyVfs.
23860 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
23870 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
23880 64 65 72 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  der;.  rc = fill
23890 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
238a0 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  yVfs, fd, dirfd,
238b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
238c0 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30  pNew, path, 0, 0
238d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
238e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
238f0 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20  pFile = pNew;.  
23900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23910 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61  OK;.  }.end_crea
23920 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20  te_proxy:    .  
23930 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
23940 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69  lently leak fd i
23950 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61  f error, we're a
23960 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20  lready in error 
23970 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
23980 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
23990 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 74 61 6b 65  n rc;.}../* take
239a0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
239b0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
239c0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
239d0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
239e0 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
239f0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
23a00 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
23a10 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
23a20 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
23a30 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
23a40 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
23a50 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
23a60 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
23a70 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
23a80 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
23a90 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
23aa0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
23ab0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
23ac0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
23ad0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
23ae0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
23af0 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
23b00 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
23b10 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
23b20 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
23b30 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
23b40 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
23b50 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
23b60 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
23b70 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
23b80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23b90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
23ba0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
23bb0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
23bc0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 63 68  onchFile;.    ch
23bd0 61 72 20 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e  ar testValue[CON
23be0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
23bf0 20 63 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43   conchValue[CONC
23c00 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
23c10 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
23c20 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
23c30 74 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  tLockPath = NULL
23c40 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
23c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
23c60 74 20 72 65 61 64 52 63 20 3d 20 53 51 4c 49 54  t readRc = SQLIT
23c70 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79  E_OK;.    int sy
23c80 6e 63 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20  ncPerms = 0;..  
23c90 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45    OSTRACE4("TAKE
23ca0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
23cb0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
23cc0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
23cd0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
23ce0 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
23cf0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
23d00 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
23d10 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72  etpid());..    r
23d20 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
23d30 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
23d40 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
23d50 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
23d60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
23d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23d80 20 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20       int pError 
23d90 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
23da0 74 28 74 65 73 74 56 61 6c 75 65 2c 20 30 2c 20  t(testValue, 0, 
23db0 43 4f 4e 43 48 4c 45 4e 29 3b 20 2f 2a 20 63 6f  CONCHLEN); /* co
23dc0 6e 63 68 20 69 73 20 66 69 78 65 64 20 73 69 7a  nch is fixed siz
23dd0 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  e */.      rc = 
23de0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 74  proxyGetHostID(t
23df0 65 73 74 56 61 6c 75 65 2c 20 26 70 45 72 72 6f  estValue, &pErro
23e00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72  r);.      if( (r
23e10 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
23e20 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 20  IOERR ){.       
23e30 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
23e40 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
23e50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
23e60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
23e70 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  h ){.        str
23e80 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b  lcpy(&testValue[
23e90 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74 78  HOSTIDLEN], pCtx
23ea0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
23eb0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
23ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23ed0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23ee0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
23ef0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
23f00 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72 65     }.    .    re
23f10 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64 28  adRc = unixRead(
23f20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
23f30 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63 68  conchFile, conch
23f40 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c  Value, CONCHLEN,
23f50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61   0);.    if( rea
23f60 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  dRc!=SQLITE_IOER
23f70 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
23f80 20 20 20 20 20 20 69 66 28 20 72 65 61 64 52 63        if( readRc
23f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23fa0 20 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30         if( (rc&0
23fb0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
23fc0 52 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RR ){.          
23fd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
23fe0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
23ff0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
24000 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
24010 72 65 61 64 52 63 3b 0a 20 20 20 20 20 20 20 20  readRc;.        
24020 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
24030 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
24040 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
24050 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61  h has data compa
24060 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
24070 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
24080 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
24090 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
240a0 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c  for auto-named l
240b0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20  ocal lock file, 
240c0 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68  just check the h
240d0 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c  ost ID and we'll
240e0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  .         ** use
240f0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
24100 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
24110 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
24120 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  e */.        if(
24130 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61 6c   !memcmp(testVal
24140 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20  ue, conchValue, 
24150 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
24160 20 20 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74          tLockPat
24170 68 20 3d 20 28 63 68 61 72 20 2a 29 26 63 6f 6e  h = (char *)&con
24180 63 68 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45  chValue[HOSTIDLE
24190 4e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  N];.          go
241a0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
241b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
241c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
241d0 20 2f 2a 20 77 65 27 76 65 20 67 6f 74 20 74 68   /* we've got th
241e0 65 20 63 6f 6e 63 68 20 69 66 20 63 6f 6e 63 68  e conch if conch
241f0 56 61 6c 75 65 20 6d 61 74 63 68 65 73 20 6f 75  Value matches ou
24200 72 20 70 61 74 68 20 61 6e 64 20 68 6f 73 74 20  r path and host 
24210 49 44 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ID */.        if
24220 28 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61  ( !memcmp(testVa
24230 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c  lue, conchValue,
24240 20 43 4f 4e 43 48 4c 45 4e 29 20 29 7b 0a 20 20   CONCHLEN) ){.  
24250 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
24260 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
24270 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
24290 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6d  * a short read m
242a0 65 61 6e 73 20 77 65 27 72 65 20 22 63 72 65 61  eans we're "crea
242b0 74 69 6e 67 22 20 74 68 65 20 63 6f 6e 63 68 20  ting" the conch 
242c0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20  (even though it 
242d0 63 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20  could .      ** 
242e0 68 61 76 65 20 62 65 65 6e 20 75 73 65 72 2d 69  have been user-i
242f0 6e 74 65 72 76 65 6e 74 69 6f 6e 29 2c 20 69 66  ntervention), if
24300 20 77 65 20 61 63 71 75 69 72 65 20 74 68 65 20   we acquire the 
24310 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 0a  exclusive lock,.
24320 20 20 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74        ** we'll t
24330 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
24340 63 75 72 72 65 6e 74 20 6f 6e 2d 64 69 73 6b 20  current on-disk 
24350 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74  permissions of t
24360 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
24370 20 20 2a 2f 0a 20 20 20 20 20 20 73 79 6e 63 50    */.      syncP
24380 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  erms = 1;.    }.
24390 20 20 20 20 0a 20 20 20 20 2f 2a 20 65 69 74 68      .    /* eith
243a0 65 72 20 63 6f 6e 63 68 20 77 61 73 20 65 6d 74  er conch was emt
243b0 70 79 20 6f 72 20 64 69 64 6e 27 74 20 6d 61 74  py or didn't mat
243c0 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  ch */.    if( !p
243d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
243e0 74 68 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 78  th ){.      prox
243f0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
24400 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
24410 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
24420 3b 0a 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74  ;.      tLockPat
24430 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
24440 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65 73      strlcpy(&tes
24450 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e  tValue[HOSTIDLEN
24460 5d 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  ], lockPath, MAX
24470 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 7d 0a  PATHLEN);.    }.
24480 20 20 20 20 0a 20 20 20 20 2f 2a 20 75 70 64 61      .    /* upda
24490 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f  te conch with ho
244a0 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69  st and path (thi
244b0 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f  s will fail if o
244c0 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
244d0 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
244e0 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 20  d lock already) 
244f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  */.    rc = conc
24500 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
24510 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
24520 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
24530 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
24540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24560 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
24570 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
24580 6f 6e 63 68 46 69 6c 65 2c 20 74 65 73 74 56 61  onchFile, testVa
24590 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20 30  lue, CONCHLEN, 0
245a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
245b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 79  =SQLITE_OK && sy
245c0 6e 63 50 65 72 6d 73 20 29 7b 0a 20 20 20 20 20  ncPerms ){.     
245d0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
245e0 75 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  uf;.        int 
245f0 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
24600 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
24610 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20       if( err==0 
24620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
24630 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
24640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
24650 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f  ermissions, igno
24660 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69  re failure */.#i
24670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f  fndef SQLITE_PRO
24680 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20  XY_DEBUG.       
24690 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
246a0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d  ile->h, buf.st_m
246b0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
246c0 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
246d0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
246e0 75 66 2e 73 74 5f 6d 6f 64 65 29 21 3d 30 20 29  uf.st_mode)!=0 )
246f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
24700 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
24710 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
24720 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
24730 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69  mod %o FAILED wi
24740 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  th %d %s\n",.   
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 20 20 62 75 66 2e 73 74            buf.st
24770 5f 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72  _mode, code, str
24780 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20  error(code));.  
24790 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
247a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
247b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
247c0 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
247d0 5c 6e 22 2c 62 75 66 2e 73 74 5f 6d 6f 64 65 29  \n",buf.st_mode)
247e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
247f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24800 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
24810 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
24820 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
24830 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b  r, "STAT FAILED[
24840 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e  %d] with %d %s\n
24850 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
24870 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  r, code, strerro
24880 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66  r(code));.#endif
24890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
248a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e   }.    }.    con
248b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
248c0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
248d0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
248e0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
248f0 0a 20 20 0a 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  .  .end_takeconc
24900 68 3a 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  h:.    OSTRACE2(
24910 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
24920 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
24930 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ->h);.    if( rc
24940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24950 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
24960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
24970 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64  le->h>=0 ){.#ifd
24980 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f  ef STRICT_CLOSE_
24990 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 69 66  ERROR.        if
249a0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
249b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
249c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
249d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
249e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
249f0 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
24a00 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
24a10 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c        close(pFil
24a20 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e->h); /* silent
24a30 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61  ly leak fd if fa
24a40 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  il */.#endif.   
24a50 20 20 20 7d 0a 20 20 20 20 20 20 70 46 69 6c 65     }.      pFile
24a60 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
24a70 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43  int fd = open(pC
24a80 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
24a90 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
24ac0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
24ad0 53 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  S);.      OSTRAC
24ae0 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E2("TRANSPROXY: 
24af0 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
24b00 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d  ;.      if( fd>=
24b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
24b20 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
24b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24b40 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
24b50 50 45 4e 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  PEN; /* SQLITE_B
24b60 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
24b70 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
24ba0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
24bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
24bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24bd0 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  && !pCtx->lockPr
24be0 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 63 68 61  oxy ){.      cha
24bf0 72 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63 6b 50  r *path = tLockP
24c00 61 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74 68 20  ath ? tLockPath 
24c10 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
24c20 79 50 61 74 68 3b 0a 20 20 20 20 20 20 2f 2a 20  yPath;.      /* 
24c30 41 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d 61 6b  ACS: Need to mak
24c40 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
24c50 20 73 6f 6d 65 74 69 6d 65 73 20 2a 2f 0a 20 20   sometimes */.  
24c60 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
24c70 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
24c80 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
24c90 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
24ca0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24cb0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 74 78 2d  K ){.      pCtx-
24cc0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
24cd0 0a 20 20 20 20 20 20 69 66 28 20 74 4c 6f 63 6b  .      if( tLock
24ce0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
24cf0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
24d00 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
24d10 74 72 44 75 70 28 30 2c 20 74 4c 6f 63 6b 50 61  trDup(0, tLockPa
24d20 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
24d30 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
24d40 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
24d50 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
24d60 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63          ((afpLoc
24d70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
24d80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
24d90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
24da0 64 62 50 61 74 68 20 3d 0a 20 20 20 20 20 20 20  dbPath =.       
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
24dc0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
24dd0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
24de0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
24df0 7b 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c  {.      conchFil
24e00 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
24e10 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
24e20 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
24e30 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
24e40 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45    OSTRACE3("TAKE
24e50 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
24e60 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72   conchFile->h, r
24e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
24e80 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ":"failed");.   
24e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
24eb0 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
24ec0 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
24ed0 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
24ee0 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
24ef0 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
24f00 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
24f10 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
24f20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24f30 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
24f40 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
24f50 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
24f60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
24f70 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
24f80 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
24f90 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
24fa0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
24fb0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
24fc0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
24fd0 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
24fe0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
24ff0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
25000 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
25010 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
25020 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
25030 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45  ;.  OSTRACE4("RE
25040 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
25050 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
25060 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
25070 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
25080 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
25090 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
250a0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
250b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
250c0 74 70 69 64 28 29 29 3b 0a 20 20 70 43 74 78 2d  tpid());.  pCtx-
250d0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
250e0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
250f0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
25100 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
25110 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
25120 4c 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41 43 45  LOCK);.  OSTRACE
25130 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  3("RELEASECONCH 
25140 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
25150 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
25160 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
25170 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
25180 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
25190 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
251a0 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
251b0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
251c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
251d0 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
251e0 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
251f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
25200 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
25210 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
25220 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
25230 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
25240 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
25250 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
25260 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25270 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
25280 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
25290 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
252a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
252b0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
252c0 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
252d0 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
252e0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
252f0 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
25300 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
25310 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
25320 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
25330 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
25340 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
25350 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
25360 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
25370 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
25380 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
25390 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
253c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
253d0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
253e0 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
253f0 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
25400 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
25410 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
25420 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
25430 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
25440 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
25450 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
25460 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
25470 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
25480 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
25490 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
254a0 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
254b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
254c0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
254d0 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
254e0 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
254f0 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
25500 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
25510 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
25520 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
25530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25540 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
25550 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
25560 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
25570 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
25580 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
25590 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
255a0 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
255b0 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
255c0 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
255d0 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
255e0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
255f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25600 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
25610 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
25620 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
25630 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
25640 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
25650 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
25660 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
25670 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
25680 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
25690 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
256a0 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
256b0 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
256c0 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
256d0 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
256e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
256f0 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
25700 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
25710 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
25720 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
25730 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
25740 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
25750 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
25760 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
25770 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
25780 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
25790 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
257a0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
257b0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
257c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
257d0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
257e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
257f0 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
25800 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
25810 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
25820 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
25830 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
25840 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
25850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
25860 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
25870 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
25880 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
25890 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
258a0 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
258b0 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
258c0 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
258d0 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
258e0 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
258f0 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
25900 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
25910 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
25920 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
25930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25940 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
25950 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
25960 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
25970 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
25980 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
25990 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
259a0 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
259b0 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
259c0 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
259d0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
259e0 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
259f0 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
25a00 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
25a10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25a20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25a30 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
25a40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
25a50 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
25a60 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
25a70 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
25a80 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
25a90 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
25aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25ab0 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
25ac0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
25ad0 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
25ae0 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
25af0 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
25b00 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
25b10 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
25b20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
25b30 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
25b40 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
25b50 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
25b60 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
25b70 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
25b80 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
25b90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
25ba0 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
25bb0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
25bc0 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
25bd0 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
25be0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28  __APPLE__).  if(
25bf0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
25c00 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
25c10 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73   ){.    /* afp s
25c20 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66  tyle keeps a ref
25c30 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62  erence to the db
25c40 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c   path in the fil
25c50 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20  ePath field .   
25c60 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63   ** of the struc
25c70 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
25c80 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68   (int)strlen((ch
25c90 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
25ca0 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
25cb0 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
25cc0 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  rcpy(dbPath, ((a
25cd0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
25ce0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
25cf0 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
25d00 68 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  h);.  }else.#end
25d10 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
25d20 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c  pMethod == &dotl
25d30 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
25d40 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
25d50 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
25d60 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
25d70 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
25d80 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65  lock.    ** file
25d90 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
25da0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63   len = strlen((c
25db0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
25dc0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73  kingContext) - s
25dd0 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55  trlen(DOTLOCK_SU
25de0 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70  FFIX);.    memcp
25df0 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
25e00 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
25e10 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31  Context, len + 1
25e20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25e30 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79  /* all other sty
25e40 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b  les use the lock
25e50 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
25e60 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65  tore the db file
25e70 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73   path */.    ass
25e80 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
25e90 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
25ea0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
25eb0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
25ec0 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
25ed0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
25ee0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
25ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25f00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  OK;.}../*.** Tak
25f10 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69  es an already fi
25f20 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c  lled in unix fil
25f30 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20  e and alters it 
25f40 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b  so all file lock
25f50 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ing .** will be 
25f60 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
25f70 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63   local proxy loc
25f80 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c  k file.  The fol
25f90 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a  lowing fields.**
25fa0 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69   are preserved i
25fb0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
25fc0 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68  ntext so that th
25fd0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
25fe0 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75  ed and .** the u
25ff0 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72  nix structure pr
26000 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75  operly cleaned u
26010 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a  p at close time:
26020 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  .**  ->lockingCo
26030 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74  ntext.**  ->pMet
26040 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hod.*/.static in
26050 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
26060 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
26070 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
26080 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
26090 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
260a0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61  ext *pCtx;.  cha
260b0 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48  r dbPath[MAXPATH
260c0 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a  LEN+1];       /*
260d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
260e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
260f0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e  char *lockPath=N
26100 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ULL;.  int rc = 
26110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
26120 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
26130 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
26140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26150 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
26160 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
26170 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
26180 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
26190 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
261a0 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
261b0 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
261c0 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
261d0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
261e0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
261f0 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
26200 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 52 41  .  OSTRACE4("TRA
26210 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
26220 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
26230 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
26240 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
26250 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
26260 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  :"), getpid());.
26270 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65  .  pCtx = sqlite
26280 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
26290 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28  (*pCtx) );.  if(
262a0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
262b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
262c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
262d0 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(pCtx, 0, sizeo
262e0 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63  f(*pCtx));..  rc
262f0 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f   = proxyCreateCo
26300 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61  nchPathname(dbPa
26310 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
26320 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28  FilePath);.  if(
26330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26340 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  {.    rc = proxy
26350 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
26360 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
26370 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
26380 46 69 6c 65 29 3b 0a 20 20 7d 20 20 0a 20 20 69  File);.  }  .  i
26390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
263a0 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a   && lockPath ){.
263b0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
263c0 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
263d0 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63  3DbStrDup(0, loc
263e0 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69  kPath);.  }..  i
263f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26400 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
26410 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
26420 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
26430 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
26440 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
26450 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
26460 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
26470 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
26480 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
26490 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74  ->dbPath = sqlit
264a0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62  e3DbStrDup(0, db
264b0 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d  Path);.    pCtx-
264c0 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
264d0 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt = pFile->lock
264e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
264f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
26500 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20  ntext = pCtx;.  
26510 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68    pCtx->pOldMeth
26520 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
26530 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  hod;.    pFile->
26540 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79  pMethod = &proxy
26550 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
26560 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78  se{.    if( pCtx
26570 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a  ->conchFile ){ .
26580 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d        rc = pCtx-
26590 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74  >conchFile->pMet
265a0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
265b0 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78  ite3_file *)pCtx
265c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
265d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
265e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
265f0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
26600 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
26610 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
26620 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
26630 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73  ilePath); .    s
26640 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
26650 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
26660 33 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  3("TRANSPROXY  %
26670 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
26680 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
26690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
266a0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
266b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
266c0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
266d0 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71  utine handles sq
266e0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
266f0 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ol() calls that 
26700 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  are specific.** 
26710 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  to proxy locking
26720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26730 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
26740 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
26750 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
26760 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
26770 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
26780 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
26790 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
267a0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
267b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
267c0 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
267d0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
267e0 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
267f0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
26800 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
26810 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
26820 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
26830 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
26840 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78  xt;.        prox
26850 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
26860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26870 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
26880 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
26890 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
268a0 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  pArg = pCtx->loc
268b0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
268c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
268d0 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
268e0 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75  r **)pArg = ":au
268f0 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b  to: (not held)";
26900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26910 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
26920 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
26930 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20  *)pArg = NULL;. 
26940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
26950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
26970 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
26980 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
26990 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
269a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
269b0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
269c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
269d0 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c   int isProxyStyl
269e0 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74  e = (pFile->pMet
269f0 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
26a00 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69  ethods);.      i
26a10 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c  f( pArg==NULL ||
26a20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
26a30 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
26a40 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
26a50 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
26a60 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
26a70 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20  y locking - not 
26a80 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
26a90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26aa0 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54  TE_ERROR /*SQLIT
26ab0 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49  E_PROTOCOL? SQLI
26ac0 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20  TE_MISUSE?*/;.  
26ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26ae0 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
26af0 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
26b00 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d   - already off -
26b10 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20   NOOP */.       
26b20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26b30 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
26b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
26b60 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74  oxyPath = (const
26b70 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20   char *)pArg;.  
26b80 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
26b90 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
26ba0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
26bb0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
26bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72  .            (pr
26bd0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
26be0 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
26bf0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
26c00 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
26c10 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20  pArg, ":auto:") 
26c20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
26c30 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
26c40 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20  ath &&.         
26c50 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70        !strncmp(p
26c60 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
26c70 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d  th, proxyPath, M
26c80 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20  AXPATHLEN)).    
26c90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26ca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26cb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
26cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26cd0 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63    rc = switchLoc
26ce0 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65  kProxyPath(pFile
26cf0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
26d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26d20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72     /* turn on pr
26d30 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
26d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
26d50 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
26d60 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  mUnixFile(pFile,
26d70 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
26d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26d90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26da0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
26db0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
26dc0 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  t( 0 );  /* The 
26dd0 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61  call assures tha
26de0 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63  t only valid opc
26df0 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f  odes are sent */
26e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
26e10 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65  OTREACHED*/.  re
26e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26e30 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68  R;.}../*.** With
26e40 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  in this division
26e50 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c   (the proxying l
26e60 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
26e70 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65  ation) the proce
26e80 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74  dures.** above t
26e90 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c  his point are al
26ea0 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68  l utilities.  Th
26eb0 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d  e lock-related m
26ec0 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a  ethods of the.**
26ed0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73   proxy-locking s
26ee0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26ef0 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a   object follow..
26f00 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
26f10 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
26f20 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
26f30 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
26f40 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
26f50 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
26f60 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
26f70 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
26f80 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
26f90 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
26fa0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
26fb0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
26fc0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
26fd0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
26fe0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
26ff0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
27000 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
27010 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27020 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
27030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
27040 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
27050 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
27060 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
27070 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
27080 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
27090 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
270a0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
270b0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
270c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
270d0 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
270e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
270f0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
27100 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
27110 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
27120 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
27130 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
27140 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 65 74 75  kProxy;.    retu
27150 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  rn proxy->pMetho
27160 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  d->xCheckReserve
27170 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  dLock((sqlite3_f
27180 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73  ile*)proxy, pRes
27190 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
271a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
271b0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
271c0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
271d0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
271e0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
271f0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
27200 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
27210 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
27220 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
27230 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
27240 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
27250 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
27260 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
27270 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
27280 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
27290 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
272a0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
272b0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
272c0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
272d0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
272e0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
272f0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
27300 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
27310 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
27320 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
27330 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
27340 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
27350 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
27360 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
27370 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
27380 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
27390 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
273a0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
273b0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
273c0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
273d0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
273e0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
273f0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
27400 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
27410 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
27420 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
27430 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
27440 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
27450 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
27460 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
27470 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
27480 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
27490 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
274a0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
274b0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
274c0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
274d0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
274e0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
274f0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
27500 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
27510 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
27520 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
27530 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
27540 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
27550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27560 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
27570 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
27580 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
27590 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
275a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
275b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
275c0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
275d0 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  oxy;.    rc = pr
275e0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  oxy->pMethod->xL
275f0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
27600 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79  e*)proxy, lockty
27610 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  pe);.    pFile->
27620 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
27630 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  ->locktype;.  }.
27640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27650 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
27660 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
27670 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
27680 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
27690 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
276a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
276b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
276c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
276d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
276e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
276f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
27700 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
27710 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
27720 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
27730 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
27740 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
27750 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
27760 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
27770 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
27780 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
27790 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
277a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
277b0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
277c0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
277d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
277e0 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
277f0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
27800 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
27810 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
27820 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
27830 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
27840 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
27850 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d  kProxy;.    rc =
27860 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
27870 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
27880 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c  3_file*)proxy, l
27890 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46  ocktype);.    pF
278a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
278b0 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b  proxy->locktype;
278c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
278d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
278e0 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
278f0 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
27900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
27910 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
27920 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
27930 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
27940 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
27950 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
27960 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
27970 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
27980 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
27990 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
279a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
279b0 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
279c0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
279d0 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
279e0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
279f0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
27a00 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
27a10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
27a20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
27a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
27a40 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
27a50 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
27a60 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
27a70 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
27a80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27a90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
27aa0 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
27ab0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
27ac0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
27ad0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
27ae0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27af0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
27b00 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
27b10 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
27b20 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
27b30 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
27b40 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
27b50 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
27b60 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
27b70 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
27b80 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
27b90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27ba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
27bb0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
27bc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
27bd0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
27be0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
27bf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27c00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
27c20 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
27c30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27c40 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
27c50 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
27c60 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
27c70 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
27c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27c90 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20  Ctx->dbPath);.  
27ca0 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65    /* restore the
27cb0 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   original lockin
27cc0 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
27cd0 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65  ethod then close
27ce0 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   it */.    pFile
27cf0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
27d00 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b   = pCtx->oldLock
27d10 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
27d20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
27d30 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
27d40 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  d;.    sqlite3_f
27d50 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72  ree(pCtx);.    r
27d60 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65  eturn pFile->pMe
27d70 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29  thod->xClose(id)
27d80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27d90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23  QLITE_OK;.}....#
27da0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
27db0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
27dc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27dd0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
27de0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
27df0 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69  cking style is i
27e00 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
27e10 77 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73  with AFP filesys
27e20 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e  tems..** And sin
27e30 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73  ce AFP is only s
27e40 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f  upported on MacO
27e50 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  SX, the proxy lo
27e60 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a  cking is also.**
27e70 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d   restricted to M
27e80 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a  acOSX..** .**.**
27e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ea0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  * End of the pro
27eb0 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  xy lock implemen
27ec0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
27ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
27ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
27f30 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
27f40 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
27f50 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
27f60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
27f70 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c  ne registers all
27f80 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
27f90 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69  ions for unix-li
27fa0 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20  ke operating.** 
27fb0 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72  systems.  This r
27fc0 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20  outine, and the 
27fd0 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29  sqlite3_os_end()
27fe0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f   routine that fo
27ff0 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  llows,.** should
28000 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75   be the only rou
28010 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
28020 6c 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69  le that are visi
28030 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a  ble from other.*
28040 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  * files..**.** T
28050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
28060 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e  alled once durin
28070 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c  g SQLite initial
28080 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61  ization and by a
28090 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61  .** single threa
280a0 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  d.  The memory a
280b0 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75  llocation and mu
280c0 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68  tex subsystems h
280d0 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73  ave not.** neces
280e0 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74  sarily been init
280f0 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
28100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
28110 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79  led, and so they
28120 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  .** should not b
28130 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  e used..*/.int s
28140 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
28150 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a  oid){ .  /* .  *
28160 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
28170 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e  macro defines an
28180 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72   initializer for
28190 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20   an sqlite3_vfs 
281a0 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
281b0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
281c0 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70   is NAME.  The p
281d0 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69  AppData is a poi
281e0 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65  nter to a pointe
281f0 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66  r.  ** to the "f
28200 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e  inder" function.
28210 20 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61    (pAppData is a
28220 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f   pointer to a po
28230 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20  inter because.  
28240 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c  ** silly C90 rul
28250 65 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f  es prohibit a vo
28260 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63  id* from being c
28270 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ast to a functio
28280 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  n pointer.  ** a
28290 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  nd so we have to
282a0 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
282b0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69  intermediate poi
282c0 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  nter to avoid pr
282d0 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e  oblems.  ** when
282e0 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
282f0 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
28300 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20   on GCC.).  **. 
28310 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70   ** The FINDER p
28320 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
28330 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61   macro is the na
28340 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  me of the pointe
28350 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  r to the.  ** fi
28360 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20  nder-function.  
28370 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  The finder-funct
28380 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
28390 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  inter to the.  *
283a0 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68  * sqlite_io_meth
283b0 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ods object that 
283c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64  implements the d
283d0 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20  esired locking. 
283e0 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20   ** behaviors.  
283f0 53 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e  See the division
28400 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74   above that cont
28410 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f  ains the IOMETHO
28420 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f  DS.  ** macro fo
28430 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72  r addition infor
28440 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72  mation on finder
28450 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  -functions..  **
28460 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  .  ** Most finde
28470 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  rs simply return
28480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
28490 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
284a0 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62  _methods.  ** ob
284b0 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22  ject.  But the "
284c0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
284d0 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  " available on M
284e0 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74  acOSX does a lit
284f0 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68  tle.  ** more th
28500 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b  an that; it look
28510 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
28520 74 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f  tem type that ho
28530 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  sts the .  ** da
28540 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
28550 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20  tries to choose 
28560 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  an locking metho
28570 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
28580 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65  r.  ** that file
28590 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a  system time..  *
285a0 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58  /.  #define UNIX
285b0 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e  VFS(VFSNAME, FIN
285c0 44 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20  DER) {          
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
285e0 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
285f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
28600 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
28610 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28620 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c    sizeof(unixFil
28630 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
28640 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ile */          
28650 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
28660 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20  MAX_PATHNAME,   
28670 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
28680 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
28690 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c          \.    0,
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20      /* pNext */ 
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e        \.    VFSN
286e0 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  AME,            
286f0 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20    /* zName */   
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a      \.    (void*
28720 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20  )&FINDER,       
28730 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20  /* pAppData */  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e    \.    unixOpen
28760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28770 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20   xOpen */       
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65  \.    unixDelete
287a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
287b0 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20  Delete */       
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
287d0 20 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20      unixAccess, 
287e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
287f0 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  cess */         
28800 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28810 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61    unixFullPathna
28820 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
28830 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20  Pathname */     
28840 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
28850 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20  unixDlOpen,     
28860 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
28870 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28880 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
28890 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  ixDlError,      
288a0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
288b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
288c0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
288d0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
288e0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20    /* xDlSym */  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
28910 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28920 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20  /* xDlClose */  
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64    \.    unixRand
28950 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
28960 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20   xRandomness */ 
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c  \.    unixSleep,
28990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
289a0 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20  Sleep */        
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
289c0 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54      unixCurrentT
289d0 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
289e0 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20  rrentTime */    
289f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28a00 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72    unixGetLastErr
28a10 6f 72 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or      /* xGetL
28a20 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  astError */     
28a30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
28a40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
28a50 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
28a60 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
28a70 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
28a80 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
28a90 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
28aa0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
28ab0 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
28ac0 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
28ad0 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
28ae0 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
28af0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
28b00 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
28b10 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
28b20 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
28b30 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
28b40 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
28b50 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
28b60 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
28b70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
28b80 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
28b90 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56  PLE__).    UNIXV
28ba0 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
28bb0 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
28bc0 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
28bd0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
28be0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
28bf0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
28c00 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
28c10 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
28c20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
28c30 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
28c40 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
28c50 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
28c60 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ,.#if OS_VXWORKS
28c70 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
28c80 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65  ix-namedsem", se
28c90 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  mIoFinder ),.#en
28ca0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
28cb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28cc0 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28  YLE.    UNIXVFS(
28cd0 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20  "unix-posix",   
28ce0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
28cf0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
28d00 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66  nix-flock",    f
28d10 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
28d20 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
28d30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28d40 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
28d50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
28d60 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61   UNIXVFS("unix-a
28d70 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46  fp",      afpIoF
28d80 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
28d90 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79  XVFS("unix-proxy
28da0 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e  ",    proxyIoFin
28db0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
28dc0 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
28dd0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
28de0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
28df0 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
28e00 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65  all VFSes define
28e10 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20  d in the aVfs[] 
28e20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69  array */.  for(i
28e30 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56  =0; i<(sizeof(aV
28e40 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74  fs)/sizeof(sqlit
28e50 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a  e3_vfs)); i++){.
28e60 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
28e70 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69  register(&aVfs[i
28e80 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20  ], i==0);.  }.  
28e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28ea0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  ; .}../*.** Shut
28eb0 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69  down the operati
28ec0 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
28ed0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20  ace..**.** Some 
28ee0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
28ef0 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  s might need to 
28f00 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20  do some cleanup 
28f10 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  in this routine,
28f20 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64  .** to release d
28f30 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
28f40 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42  ated objects.  B
28f50 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a  ut not on unix..
28f60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28f70 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75  is a no-op for u
28f80 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nix..*/.int sqli
28f90 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
28fa0 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
28fb0 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64  TE_OK; .}. .#end
28fc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
28fd0 55 4e 49 58 20 2a 2f 0a                          UNIX */.