/ Hex Artifact Content
Login

Artifact b62e660f82f4aa37d68ff4ffb11673ee4c75e1c9:


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 37 20 32 30 30 39 2f 30  c,v 1.247 2009/0
0810: 33 2f 32 38 20 32 33 3a 34 37 3a 31 31 20 64 72  3/28 23:47:11 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 0a 20 20 20 20 2f 2a 20 44  pOpen;..    /* D
c030: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
c040: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
c050: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
c060: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
c070: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
c080: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
c090: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
c0a0: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
c0b0: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
c0c0: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
c0d0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
c0e0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
c0f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  t==0 ){.      lo
c100: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
c110: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
c120: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c130: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
c140: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
c150: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
c160: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c170: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
c180: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c190: 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
c1a0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c1b0: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
c1c0: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
c1d0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
c1e0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  -1) ){.        p
c1f0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c200: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
c210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
c220: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
c230: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
c240: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
c250: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
c260: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
c270: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
c280: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
c290: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
c2a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c2b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c2d0: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a  pLock->cnt = 1;.
c2e0: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
c2f0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
c300: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
c310: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
c320: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  LOCK;.        go
c330: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
c340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c350: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
c360: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
c370: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
c380: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
c390: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
c3a0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
c3b0: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
c3c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c3d0: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
c3e0: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
c3f0: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
c400: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
c410: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
c420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c430: 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c      pOpen = pFil
c440: 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20  e->pOpen;.      
c450: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  pOpen->nLock--;.
c460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
c470: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
c480: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
c490: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
c4a0: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
c4b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
c4c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
c4d0: 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
c4e0: 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
c4f0: 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 20 70        /* close p
c500: 65 6e 64 69 6e 67 20 66 64 73 2c 20 62 75 74 20  ending fds, but 
c510: 69 66 20 63 6c 6f 73 69 6e 67 20 66 61 69 6c 73  if closing fails
c520: 20 64 6f 6e 27 74 20 66 72 65 65 20 74 68 65 20   don't free the 
c530: 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20 20  array.          
c540: 2a 2a 20 61 73 73 69 67 6e 20 2d 31 20 74 6f 20  ** assign -1 to 
c550: 74 68 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  the successfully
c560: 20 63 6c 6f 73 65 64 20 64 65 73 63 72 69 70 74   closed descript
c570: 6f 72 73 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ors and record t
c580: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
c590: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 65 78 74  error.  The next
c5a0: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f   attempt to unlo
c5b0: 63 6b 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69  ck will try agai
c5c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
c5d0: 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  if( pOpen->aPend
c5e0: 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e  ing[i] < 0 ) con
c5f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c600: 20 69 66 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e   if( close(pOpen
c610: 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29  ->aPending[i]) )
c620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
c630: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c640: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
c650: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c660: 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  IOERR_CLOSE;.   
c670: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c680: 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d            pOpen-
c690: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d  >aPending[i] = -
c6a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
c6b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c6c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c6d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
c6e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70  sqlite3_free(pOp
c6f0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20  en->aPending);. 
c700: 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e           pOpen->
c710: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
c720: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61          pOpen->a
c730: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
c740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c750: 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75     }.  }...end_u
c760: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
c770: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
c780: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c790: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c7a0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
c7b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c7c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c7d0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
c7e0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
c7f0: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
c800: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
c810: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
c820: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
c830: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
c840: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
c850: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
c860: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
c870: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
c880: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
c890: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
c8a0: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
c8b0: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
c8c0: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
c8d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
c8e0: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
c8f0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
c900: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
c910: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
c920: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
c930: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
c940: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
c950: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
c960: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
c970: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
c980: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c990: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
c9a0: 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  ( pFile ){.    i
c9b0: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
c9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c9d0: 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
c9e0: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20  e->dirfd);.     
c9f0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
ca00: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ca10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ca20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ca30: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
ca40: 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OSE;.      }else
ca50: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
ca60: 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20  >dirfd=-1;.     
ca70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
ca80: 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
ca90: 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
caa0: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
cab0: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
cac0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
cad0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
cae0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
caf0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
cb00: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CLOSE;.      }. 
cb10: 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f     }.#if OS_VXWO
cb20: 52 4b 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c  RKS.    if( pFil
cb30: 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20  e->pId ){.      
cb40: 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c  if( pFile->isDel
cb50: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ete ){.        u
cb60: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
cb70: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
cb80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cb90: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
cba0: 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64  ileId(pFile->pId
cbb0: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
cbc0: 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pId = 0;.    }.#
cbd0: 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43  endif.    OSTRAC
cbe0: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
cbf0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
cc00: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
cc10: 2d 31 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  -1);.    memset(
cc20: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
cc30: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d  (unixFile));.  }
cc40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cc50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
cc60: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
cc70: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
cc80: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
cc90: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
cca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ccb0: 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
ccc0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ccd0: 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
cce0: 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64     unixUnlock(id
ccf0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
cd00: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
cd10: 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
cd20: 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
cd30: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
cd40: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
cd50: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
cd60: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
cd70: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
cd80: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
cd90: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
cda0: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
cdb0: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
cdc0: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
cdd0: 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
cde0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
cdf0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
ce00: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
ce10: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
ce20: 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
ce30: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
ce40: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
ce50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  /.      int *aNe
ce60: 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  w;.      struct 
ce70: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
ce80: 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  en = pFile->pOpe
ce90: 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20  n;.      aNew = 
cea0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
ceb0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c  pOpen->aPending,
cec0: 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e   (pOpen->nPendin
ced0: 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29  g+1)*sizeof(int)
cee0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e   );.      if( aN
cef0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
cf00: 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20   /* If a malloc 
cf10: 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b  fails, just leak
cf20: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
cf30: 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ptor */.      }e
cf40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
cf50: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61  en->aPending = a
cf60: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  New;.        pOp
cf70: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
cf80: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
cf90: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
cfa0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
cfb0: 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  g++;.        pFi
cfc0: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
cfd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
cfe0: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
cff0: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
d000: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
d010: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
d020: 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
d030: 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
d040: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
d050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d060: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
d070: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
d080: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
d090: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
d0a0: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
d0b0: 2a 2a 2a 2a 0a 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 2a  ****************
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2f 0a 0a 2f 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 2a 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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d150: 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
d180: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
d190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1a0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
d1b0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
d1c0: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
d1d0: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
d1e0: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
d1f0: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
d200: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
d210: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
d220: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
d230: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
d240: 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
d250: 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
d260: 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
d270: 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
d280: 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
d290: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
d2a0: 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
d2b0: 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
d2c0: 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
d2d0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
d2e0: 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
d2f0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
d300: 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
d310: 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
d320: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
d330: 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
d340: 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
d350: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d360: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
d370: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
d380: 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
d390: 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
d3a0: 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
d3b0: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
d3c0: 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
d3d0: 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
d3e0: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
d3f0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
d400: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d410: 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
d420: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d430: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
d440: 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
d450: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d460: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
d470: 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
d480: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
d490: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
d4a0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
d4b0: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
d4c0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
d4d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
d4e0: 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
d4f0: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
d500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
d510: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
d520: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d530: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
d540: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
d550: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
d560: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
d570: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d580: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
d590: 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
d5a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
d5b0: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
d5c0: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
d5d0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
d5e0: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
d5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
d610: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
d620: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
d630: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
d640: 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
d650: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
d660: 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
d670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
d680: 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
d690: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
d6a0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
d6b0: 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d700: 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 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 2a 2a 2a  ****************
d740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d750: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
d760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d770: 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
d780: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
d790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d7a0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
d7b0: 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
d7c0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
d7d0: 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 69   uses the existi
d7e0: 6e 67 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ng of separate l
d7f0: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
d800: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
d810: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
d820: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
d830: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
d840: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
d850: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
d860: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
d870: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
d880: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
d890: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
d8a0: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
d8b0: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
d8c0: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
d8d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
d8e0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
d8f0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
d900: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
d910: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
d920: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
d930: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
d940: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
d950: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
d960: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
d970: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
d980: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
d990: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
d9a0: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
d9b0: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
d9c0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
d9d0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
d9e0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
d9f0: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
da00: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
da10: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
da20: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
da30: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
da40: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
da50: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
da60: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
da70: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
da80: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
da90: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
daa0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
dab0: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
dac0: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
dad0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
dae0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
daf0: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
db00: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
db10: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
db20: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
db30: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
db40: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
db50: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
db60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
db70: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
db80: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
db90: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
dba0: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
dbb0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
dbc0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
dbd0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
dbe0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
dbf0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
dc00: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
dc10: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
dc20: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
dc30: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
dc40: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
dc50: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
dc60: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
dc70: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
dc80: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
dc90: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
dca0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
dcb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
dcc0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
dcd0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
dce0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
dcf0: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
dd00: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
dd10: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
dd20: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
dd30: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
dd40: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
dd50: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
dd60: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
dd70: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
dd80: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
dd90: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
dda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
ddb0: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
ddc0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
ddd0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
dde0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
ddf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
de00: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
de10: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
de20: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
de30: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
de40: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
de50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
de60: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
de70: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
de80: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
de90: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
dea0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
deb0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
dec0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
ded0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
dee0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
def0: 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
df00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
df10: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
df20: 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
df30: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
df40: 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
df50: 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
df60: 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
df70: 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
df80: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
df90: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
dfa0: 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
dfb0: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
dfc0: 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
dfd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dfe0: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
dff0: 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
e000: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
e010: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 61      reserved = a
e020: 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  ccess(zLockFile,
e030: 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53   0)==0;.  }.  OS
e040: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
e050: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
e060: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
e070: 72 65 73 65 72 76 65 64 29 3b 0a 20 20 2a 70 52  reserved);.  *pR
e080: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
e090: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e0a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
e0b0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
e0c0: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
e0d0: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
e0e0: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
e0f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
e100: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
e110: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
e120: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
e130: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
e140: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
e150: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
e160: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
e170: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
e180: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
e190: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
e1a0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
e1b0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
e1c0: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
e1d0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
e1e0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
e1f0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
e200: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
e210: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
e220: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
e230: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
e240: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
e250: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
e260: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
e270: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
e280: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
e290: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
e2a0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
e2b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
e2c0: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
e2d0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
e2e0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
e2f0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
e300: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
e310: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
e320: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
e330: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
e340: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
e350: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
e360: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
e370: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
e380: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
e390: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
e3a0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
e3b0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
e3c0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
e3d0: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
e3e0: 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
e3f0: 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
e400: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
e410: 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
e420: 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
e430: 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
e440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
e450: 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
e460: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e470: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
e480: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e490: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e4a0: 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
e4b0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
e4c0: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
e4d0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
e4e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4f0: 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
e500: 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
e510: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
e520: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
e530: 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
e540: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
e550: 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
e560: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
e570: 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
e580: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
e590: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  type > NO_LOCK )
e5a0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
e5b0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
e5c0: 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  ;.#if !OS_VXWORK
e5d0: 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  S.    /* Always 
e5e0: 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
e5f0: 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
e600: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d  file */.    utim
e610: 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
e620: 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
e630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e640: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
e650: 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
e660: 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f  lock */.  fd = o
e670: 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f  pen(zLockFile,O_
e680: 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
e690: 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
e6a0: 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  f( fd<0 ){.    /
e6b0: 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
e6c0: 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
e6d0: 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  , someone else m
e6e0: 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74  ay have stolen t
e6f0: 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
e700: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
e710: 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
e720: 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
e730: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e740: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
e750: 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
e760: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e770: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e780: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e790: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
e7a0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
e7b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
e7c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
e7d0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
e7e0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e7f0: 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 63  rc;.  } .  if( c
e800: 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20  lose(fd) ){.    
e810: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e820: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
e830: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e840: 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20  CLOSE;.  }.  .  
e850: 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
e860: 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
e870: 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
e880: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
e890: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
e8a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
e8b0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e8c0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
e8d0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
e8e0: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
e8f0: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
e900: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
e910: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
e920: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
e930: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
e940: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e950: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
e960: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
e970: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
e980: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
e990: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
e9a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
e9b0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
e9c0: 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
e9d0: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
e9e0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
e9f0: 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
ea00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ea10: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
ea20: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
ea30: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ea40: 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
ea50: 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
ea60: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
ea70: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
ea80: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
ea90: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
eaa0: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
eab0: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
eac0: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20  h, locktype,..  
ead0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eae0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61  , getpid());.  a
eaf0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
eb00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
eb10: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
eb20: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
eb30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
eb40: 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
eb50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eb60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
eb70: 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
eb80: 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
eb90: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
eba0: 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
ebb0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
ebc0: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
ebd0: 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
ebe0: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
ebf0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
ec00: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ec10: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ec20: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
ec30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ec40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
ec50: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
ec60: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
ec70: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
ec80: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
ec90: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  t( locktype==NO_
eca0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e  LOCK );.  if( un
ecb0: 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20  link(zLockFile) 
ecc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74  ){.    int rc, t
ecd0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ece0: 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
ecf0: 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
ed00: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ed10: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ed20: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ed30: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
ed40: 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
ed50: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ed60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
ed70: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
ed80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
ed90: 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
eda0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
edb0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
edc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
edd0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
ede0: 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
edf0: 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
ee00: 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
ee10: 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
ee20: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
ee30: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
ee40: 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
ee50: 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
ee60: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
ee70: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
ee80: 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
ee90: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
eea0: 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
eeb0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
eec0: 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
eed0: 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
eee0: 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
eef0: 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
ef10: 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
ef20: 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
ef30: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
f010: 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
f020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f040: 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
f050: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
f060: 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
f070: 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
f080: 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
f090: 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
f0a0: 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
f0b0: 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
f0c0: 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
f0d0: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
f0e0: 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
f0f0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
f100: 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
f110: 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
f120: 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
f130: 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
f140: 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
f150: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
f160: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
f170: 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
f180: 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
f190: 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
f1a0: 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
f1b0: 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
f1c0: 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
f1d0: 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
f1e0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
f1f0: 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
f200: 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
f210: 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
f220: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f230: 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
f240: 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
f250: 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
f260: 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
f270: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f280: 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
f290: 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
f2a0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
f2b0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
f2c0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
f2d0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
f2e0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
f2f0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
f300: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
f310: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
f320: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
f330: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
f340: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
f350: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
f360: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
f370: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
f380: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
f390: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
f3a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
f3b0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
f3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f3d0: 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
f3e0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f3f0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
f400: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
f410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f420: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
f430: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
f440: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f450: 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
f460: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
f470: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
f480: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
f490: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
f4a0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
f4b0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
f4c0: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
f4d0: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
f4e0: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
f4f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
f500: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
f510: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
f520: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
f530: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
f540: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
f550: 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
f560: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
f570: 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
f580: 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
f590: 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
f5a0: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
f5b0: 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
f5c0: 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
f5d0: 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
f5e0: 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
f5f0: 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
f600: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
f610: 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
f620: 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
f630: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
f640: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f650: 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
f660: 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
f670: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
f680: 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
f690: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f6a0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f6b0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20  OERR_UNLOCK); . 
f6c0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
f6d0: 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
f6e0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
f6f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
f700: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f710: 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
f720: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f730: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
f740: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
f750: 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
f760: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
f770: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
f780: 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
f790: 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
f7a0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f7b0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f7c0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f7d0: 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
f7e0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f7f0: 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
f800: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f810: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
f820: 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
f830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f840: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
f850: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
f860: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
f870: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
f880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
f890: 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
f8a0: 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
f8b0: 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
f8c0: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
f8d0: 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
f8e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
f8f0: 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
f900: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
f910: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f920: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
f930: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
f940: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f950: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
f960: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
f970: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
f980: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
f990: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
f9a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f9b0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
f9c0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
f9d0: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
f9e0: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
f9f0: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
fa00: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
fa10: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
fa20: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
fa30: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
fa40: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
fa50: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
fa60: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
fa70: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
fa80: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
fa90: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
faa0: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
fab0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
fac0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
fad0: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
fae0: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
faf0: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
fb00: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
fb10: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
fb20: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
fb30: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
fb40: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
fb50: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
fb60: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
fb70: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
fb80: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
fb90: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
fba0: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
fbb0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
fbc0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
fbd0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
fbe0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
fbf0: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
fc00: 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
fc10: 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
fc20: 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
fc30: 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
fc40: 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
fc50: 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
fc60: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
fc70: 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
fc80: 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
fc90: 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
fca0: 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
fcb0: 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
fcc0: 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
fcd0: 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
fce0: 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
fcf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
fd00: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
fd10: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
fd20: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
fd30: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
fd40: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
fd50: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
fd60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
fd70: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
fd80: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
fd90: 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63  type) {.  int rc
fda0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fdb0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
fdc0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
fdd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
fde0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
fdf0: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
fe00: 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
fe10: 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
fe20: 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
fe30: 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
fe40: 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
fe50: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
fe60: 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
fe70: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fe80: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
fe90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fea0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
feb0: 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
fec0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
fed0: 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  f (flock(pFile->
fee0: 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
fef0: 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
ff00: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ff10: 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
ff20: 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
ff30: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ff40: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
ff50: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
ff60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ff70: 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
ff80: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ff90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ffa0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ffb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
ffc0: 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
ffd0: 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
ffe0: 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
fff0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10000 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10010 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c   }.  OSTRACE4("L
10020 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
10030 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
10040 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
10050 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ype), .         
10060 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
10070 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
10080 22 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ");.#ifdef SQLIT
10090 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
100a0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
100b0 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
100c0 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
100d0 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
100e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
100f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10100 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
10110 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
10120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10130 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
10140 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
10150 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10160 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
10170 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
10180 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
10190 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
101a0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
101b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
101c0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
101d0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
101e0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
101f0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
10200 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
10210 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10220 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10230 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
10240 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10250 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10260 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
10270 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10280 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
10290 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
102a0 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
102b0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
102c0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
102d0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
102e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
102f0 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
10300 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
10310 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
10320 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
10330 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
10340 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
10350 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
10360 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
10370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10380 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
10390 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
103a0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
103b0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
103c0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c  usive */.  if (l
103d0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
103e0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
103f0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
10400 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
10410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10420 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
10430 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
10440 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63  .  int rc = floc
10450 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
10460 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20  _UN);.  if (rc) 
10470 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72  {.    int r, tEr
10480 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10490 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72   r = sqliteError
104a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
104b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
104c0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
104d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
104e0 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70  OR(r) ){.      p
104f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10500 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
10510 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
10520 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
10530 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28  ERRORS.    if( (
10540 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  r & SQLITE_IOERR
10550 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
10560 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53  R ){.      r = S
10570 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
10580 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10590 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
105a0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
105b0 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72     .    return r
105c0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
105d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
105e0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
105f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10600 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
10610 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
10620 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
10630 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
10640 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
10650 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
10660 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10670 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
10680 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10690 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
106a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
106b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
106c0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
106d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106e0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
106f0 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
10700 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a  ****************
10740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10770 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
107e0 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
107f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10810 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
10820 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
10830 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
10840 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
10850 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
10860 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
10870 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
10880 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
10890 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
108a0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
108b0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
108c0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
108d0 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
108e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
108f0 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
10900 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
10910 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
10920 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
10930 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
10940 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
10950 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
10960 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
10970 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
10980 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
10990 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
109a0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
109b0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
109c0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
109d0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
109e0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
109f0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
10a00 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
10a10 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
10a20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
10a30 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
10a40 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
10a50 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
10a60 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
10a70 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
10a80 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
10a90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
10aa0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
10ab0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10ac0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10ad0 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
10ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10af0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
10b00 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
10b10 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10b20 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
10b30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
10b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
10b50 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
10b60 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
10b70 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
10b80 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
10b90 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10ba0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10bb0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
10bc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
10bd0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
10be0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
10bf0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
10c00 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
10c10 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
10c20 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
10c30 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
10c40 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
10c50 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  File->pOpen->pSe
10c60 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  m;.    struct st
10c70 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20  at statBuf;..   
10c80 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
10c90 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
10ca0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10cb0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
10cc0 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
10cd0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
10ce0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10cf0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10d00 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10d10 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
10d20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46  OCK);.        pF
10d30 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10d40 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
10d50 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
10d60 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
10d70 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
10d80 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
10d90 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
10da0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
10db0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41  ->locktype < SHA
10dc0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
10dd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10de0 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
10df0 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
10e00 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
10e10 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
10e20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
10e30 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
10e40 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70  K %d %d %d\n", p
10e50 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
10e60 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73  erved);..  *pRes
10e70 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
10e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10e90 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
10ea0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
10eb0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
10ec0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
10ed0 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
10ee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
10ef0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
10f00 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
10f10 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
10f20 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
10f30 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
10f40 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
10f50 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
10f60 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
10f70 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
10f80 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
10f90 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
10fa0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
10fb0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
10fc0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
10fd0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
10fe0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10ff0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11000 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11010 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11020 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11030 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11040 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11050 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11060 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11070 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11080 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11090 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
110a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
110b0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
110c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
110d0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
110e0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
110f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11100 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11110 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11120 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11130 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11140 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
11150 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
11160 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
11170 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
11180 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
11190 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
111a0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
111b0 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
111c0 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
111d0 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
111e0 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
111f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
11200 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
11210 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
11220 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
11230 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
11240 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11250 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
11260 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
11270 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
11280 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
11290 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
112a0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
112b0 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
112c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
112d0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
112e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
112f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11300 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
11310 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
11320 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20  >pOpen->pSem;.  
11330 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11340 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
11350 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
11360 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
11370 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
11380 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
11390 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
113a0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
113b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
113c0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
113d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
113e0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
113f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11400 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
11410 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
11420 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
11430 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
11440 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
11450 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
11460 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
11470 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
11480 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
11490 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
114a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
114b0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
114c0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
114d0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
114e0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
114f0 74 79 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  type;.. sem_end_
11500 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
11510 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
11520 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
11530 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
11540 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
11550 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
11560 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
11570 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
11580 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
11590 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
115a0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
115b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
115c0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
115d0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
115e0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
115f0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
11600 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
11620 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
11630 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
11640 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
11650 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11660 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
11670 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
11680 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b  le->pOpen->pSem;
11690 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
116a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
116b0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
116c0 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
116d0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
116e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
116f0 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65  ktype,..   pFile
11700 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
11710 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28  id());.  assert(
11720 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
11730 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
11740 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
11750 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
11760 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f  le->locktype==lo
11770 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
11780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11790 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
117a0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
117b0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
117c0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
117d0 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
117e0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
117f0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
11800 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
11810 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
11820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11830 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
11840 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
11850 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
11860 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
11870 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
11880 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
11890 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
118a0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
118b0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
118c0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
118d0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
118e0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
118f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11900 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
11910 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
11920 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
11930 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
11940 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11950 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
11960 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
11970 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
11980 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
11990 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
119a0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
119b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
119c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
119d0 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
119e0 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
119f0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
11a00 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11a10 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  .    releaseLock
11a20 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Info(pFile->pLoc
11a30 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f  k);.    releaseO
11a40 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f  penCnt(pFile->pO
11a50 70 65 6e 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  pen);.    closeU
11a60 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
11a70 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
11a80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
11aa0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
11ab0 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
11ac0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
11ad0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
11ae0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
11af0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
11b00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
11b10 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
11b20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11b30 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
11b40 2a 2a 2a 2a 0a 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 2a  ****************
11b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 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 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
11c10 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
11c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c30 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
11c40 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
11c50 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
11c60 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
11c70 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
11c80 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
11c90 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
11ca0 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
11cb0 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
11cc0 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
11cd0 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
11ce0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
11cf0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
11d00 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
11d10 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
11d20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
11d30 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
11d40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11d50 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
11d60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
11d70 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
11d80 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
11d90 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
11da0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
11db0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11dc0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
11dd0 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
11de0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
11df0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
11e00 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a  ong sharedByte;.
11e10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
11e20 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
11e30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11e40 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
11e50 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
11e60 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
11e70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
11e80 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
11e90 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
11ea0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
11eb0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
11ec0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
11ed0 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
11ee0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
11ef0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
11f00 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
11f10 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
11f20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
11f30 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
11f40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11f50 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
11f60 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
11f70 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
11f80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
11f90 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
11fa0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
11fb0 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
11fc0 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
11fd0 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
12000 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
12010 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
12020 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
12030 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
12040 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
12050 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
12060 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
12070 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
12080 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
12090 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
120a0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
120b0 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
120c0 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
120d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
120e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
120f0 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
12100 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
12110 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
12120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
12130 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
12140 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12150 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
12160 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
12170 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12180 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
12190 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
121a0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
121b0 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
121c0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
121d0 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
121e0 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
121f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
12200 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
12210 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12220 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
12230 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
12240 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
12250 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
12260 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
12270 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
12280 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
12290 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
122a0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
122b0 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
122c0 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
122d0 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
122e0 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
122f0 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
12300 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
12310 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
12320 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
12330 20 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46   .  OSTRACE6("AF
12340 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
12350 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
12360 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
12370 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
12380 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
12390 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
123a0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
123b0 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
123c0 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20   length);.  err 
123d0 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
123e0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
123f0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
12400 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
12410 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
12420 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
12430 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
12440 41 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE4("AFPSETLOCK
12450 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
12460 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
12470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
12480 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
12490 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a  error(tErrno));.
124a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
124b0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
124c0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
124d0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
124e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124f0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12500 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
12530 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
12540 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
12550 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
12560 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12570 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
12580 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
12590 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
125a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
125b0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
125c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
125d0 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
125e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
125f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
12600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12610 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12620 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12630 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12640 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12650 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12660 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12670 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12680 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12690 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
126a0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
126b0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
126c0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
126d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
126e0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
126f0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
12700 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
12710 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12720 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12730 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
12740 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
12750 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12760 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
12770 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12780 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
12790 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
127a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
127b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
127c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
127d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
127e0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
127f0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12800 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12810 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
12820 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
12830 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
12840 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
12850 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
12860 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12870 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
12880 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
12890 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
128a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
128b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
128c0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
128d0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
128e0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
128f0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12900 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
12910 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12920 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
12930 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
12940 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
12950 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
12960 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
12970 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
12980 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
12990 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
129a0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
129b0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
129c0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
129d0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
129e0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
129f0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
12a00 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
12a10 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
12a20 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
12a30 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
12a40 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
12a50 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
12a60 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
12a70 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
12a80 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
12a90 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
12aa0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
12ab0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12ac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
12ad0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
12ae0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
12af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
12b00 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
12b10 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
12b20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12b30 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20  c, reserved);.  
12b40 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12b50 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12b60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12b70 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12b80 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12b90 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12ba0 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
12bb0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12bc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12bd0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12be0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12bf0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12c00 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12c10 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12c20 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12c30 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12c40 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12c50 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12c60 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12c70 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12c80 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12c90 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12ca0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12cb0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12cc0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12cd0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12ce0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12cf0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12d00 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12d10 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12d20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12d30 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12d40 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12d50 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12d60 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12d70 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12d80 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12d90 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12da0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12db0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
12dc0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12dd0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
12de0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
12df0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12e00 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
12e10 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
12e30 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
12e40 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
12e50 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
12e60 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
12e70 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
12e80 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
12e90 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
12ea0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12eb0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
12ec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ed0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
12ee0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12ef0 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
12f00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
12f10 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
12f20 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
12f30 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
12f40 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
12f50 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
12f60 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
12f70 20 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25   %s was %s pid=%
12f80 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
12f90 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
12fa0 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
12fb0 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
12fc0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ile->locktype), 
12fd0 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
12fe0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
12ff0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
13000 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
13010 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
13020 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
13030 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
13040 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
13050 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
13060 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
13070 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
13080 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
13090 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
130a0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
130b0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
130c0 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
130d0 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
130e0 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
130f0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
13100 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
13110 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
13120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13130 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
13140 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
13150 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
13160 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
13170 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
13180 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
13190 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
131a0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
131b0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
131c0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
131d0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
131e0 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
131f0 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
13200 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13210 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
13220 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
13230 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
13240 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
13250 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
13260 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
13270 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
13280 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
13290 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e  rrent thread own
132a0 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a  s the pFile..  *
132b0 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65  /.  rc = transfe
132c0 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65  rOwnership(pFile
132d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
132e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
132f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
13300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13310 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
13320 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
13330 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
13340 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
13350 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
13360 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
13370 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
13380 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
13390 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
133a0 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
133b0 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
133c0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
133d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
133e0 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
133f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13400 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
13410 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
13420 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
13430 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
13440 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13450 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13460 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
13470 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
13480 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
13490 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
134a0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
134b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
134c0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
134d0 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
134e0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
134f0 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
13500 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
13510 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
13520 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
13530 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
13540 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
13550 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13560 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 6c 72  {.    int lk, lr
13570 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
13580 72 6e 6f 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  rno;.    .    /*
13590 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
135a0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
135b0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
135c0 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
135d0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
135e0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
135f0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
13600 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
13610 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74  (); .    context
13620 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
13630 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
13640 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
13650 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
13660 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13670 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13680 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
13690 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78  RED_FIRST+contex
136a0 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  t->sharedByte, 1
136b0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
136c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
136d0 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
136e0 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
136f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
13700 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
13710 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
13720 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
13730 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
13740 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13750 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
13760 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
13770 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
13780 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
13790 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
137a0 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72  stErrno = lrc1Er
137b0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
137c0 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
137d0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
137e0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
137f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
13800 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
13810 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
13820 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
13830 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
13840 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
13850 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
13860 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
13870 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13880 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
13890 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  _LOCK;.      pFi
138a0 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
138b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
138c0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
138d0 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
138e0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
138f0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
13900 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
13910 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
13920 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
13930 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
13940 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
13950 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
13960 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
13970 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
13980 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
13990 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79  ;.    if (lockty
139a0 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c  pe >= RESERVED_L
139b0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
139c0 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45  cktype < RESERVE
139d0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
139e0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
139f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
13a00 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
13a10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13a20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13a30 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13a40 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20  E, 1,1);.    }. 
13a50 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
13a60 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58  & locktype == EX
13a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
13a80 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
13a90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13aa0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
13ab0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13ac0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
13ad0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
13ae0 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
13af0 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
13b00 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
13b10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
13b20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
13b30 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
13b40 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
13b50 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
13b60 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13b70 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
13b80 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68       context->sh
13bb0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
13bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
13bd0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
13be0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
13bf0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
13c00 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
13c10 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
13c20 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
13c30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13c40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13c50 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
13c60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
13c90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
13ca0 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
13cb0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
13cc0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13cd0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13cf0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f  HARED_FIRST + co
13d00 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74  ntext->sharedByt
13d10 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
13d20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
13d30 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
13d40 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
13d50 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
13d60 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
13d70 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
13d80 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
13d90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13da0 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
13db0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
13dc0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
13dd0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
13df0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
13e00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
13e10 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
13e20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
13e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13e40 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
13e50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13e60 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
13e70 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
13e80 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
13e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13ea0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
13eb0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
13ec0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
13ed0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
13ee0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
13ef0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
13f00 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
13f10 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
13f20 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
13f30 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
13f40 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
13f50 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
13f60 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
13f70 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
13f80 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
13f90 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
13fa0 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
13fb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
13fc0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13fd0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13fe0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13ff0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
14000 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
14010 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
14020 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
14030 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
14040 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
14050 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14060 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
14070 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
14080 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
14090 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
140a0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
140b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
140c0 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
140d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
140e0 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
140f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14100 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14110 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14120 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
14130 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
14140 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14150 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
14160 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
14170 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14180 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
14190 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
141a0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
141b0 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
141c0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
141d0 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
141e0 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
141f0 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
14200 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
14210 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
14220 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
14230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
14250 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
14260 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14270 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
14280 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
14290 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
142a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
142b0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
142c0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
142d0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
142e0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
142f0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
14300 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  k(pCtx->dbPath, 
14310 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
14320 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
14330 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
14340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14350 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
14360 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
14370 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
14380 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
14390 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
143a0 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
143b0 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
143c0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
143d0 2b 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74  +pCtx->sharedByt
143e0 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
143f0 61 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d  afpSetLock(pCtx-
14400 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14410 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
14420 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 1);.      }. 
14430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
14440 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
14450 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ile->locktype>=P
14460 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
14470 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
14480 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74  Lock(pCtx->dbPat
14490 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
144a0 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
144b0 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
144c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
144d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
144e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
144f0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
14500 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50  etLock(pCtx->dbP
14510 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
14520 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
14530 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
14540 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
14550 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
14560 63 6c 65 61 72 20 74 68 65 20 73 68 61 72 65 64  clear the shared
14570 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
14580 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
14590 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
145a0 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  Ctx->sharedByte;
145b0 0a 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74  .    rc = afpSet
145c0 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74  Lock(pCtx->dbPat
145d0 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
145e0 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
145f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
14600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14610 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
14620 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  O_LOCK ){.      
14630 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
14640 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c  nt *pOpen = pFil
14650 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20  e->pOpen;.      
14660 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  pOpen->nLock--;.
14670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
14680 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
14690 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
146a0 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
146b0 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
146c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
146d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
146e0 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
146f0 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
14700 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
14710 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30  >aPending[i] < 0
14720 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14730 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
14740 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
14750 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
14760 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14770 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
147a0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
147b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
147c0 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
147d0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  i] = -1;.       
147e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
147f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14820 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
14830 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ng);.          p
14840 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
14850 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   0;.          pO
14860 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
14870 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14880 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14890 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
148a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
148b0 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
148c0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
148d0 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
148e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
148f0 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
14900 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
14910 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
14920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
14930 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
14940 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
14950 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
14960 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14970 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
14980 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
14990 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
149a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
149b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
149c0 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70  en && pFile->pOp
149d0 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
149e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
149f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
14a00 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
14a10 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
14a20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
14a30 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
14a40 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
14a50 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
14a60 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
14a70 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
14a80 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
14a90 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
14aa0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
14ab0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
14ac0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
14ad0 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
14ae0 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
14af0 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
14b00 20 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78       struct unix
14b10 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
14b20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
14b30 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69       aNew = sqli
14b40 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70 65  te3_realloc(pOpe
14b50 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f  n->aPending, (pO
14b60 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29  pen->nPending+1)
14b70 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
14b80 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
14b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
14ba0 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
14bb0 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65  s, just leak the
14bc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14bd0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
14be0 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
14bf0 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b  aPending = aNew;
14c00 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
14c10 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
14c20 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c  nPending] = pFil
14c30 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70 4f  e->h;.        pO
14c40 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b  pen->nPending++;
14c50 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
14c60 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
14c70 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
14c80 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
14c90 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
14ca0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
14cb0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
14cc0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
14cd0 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
14ce0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
14cf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14d00 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
14d10 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
14d20 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
14d30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
14d40 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
14d50 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
14d60 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
14d70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
14d80 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
14d90 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
14da0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
14db0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14dc0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14dd0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14de0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
14df0 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
14e00 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
14e10 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
14e20 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
14e30 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
14e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e50 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
14e60 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
14e70 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
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 2a 2a 2a 2a 2a 2a  ****************
14f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
14f40 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  Non-locking sqli
14f50 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
14f60 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14f80 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69  *.** The next di
14f90 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
14fa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
14fb0 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20  for all methods 
14fc0 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  of the .** sqlit
14fd0 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f  e3_file object o
14fe0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  ther than the lo
14ff0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20  cking methods.  
15000 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d  The locking.** m
15010 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69  ethods were defi
15020 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73  ned in divisions
15030 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b   above (one lock
15040 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a  ing method per.*
15050 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68  * division).  Th
15060 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  ose methods that
15070 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   are common to a
15080 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73  ll locking modes
15090 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74  .** are gather t
150a0 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69  ogether into thi
150b0 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a  s division..*/..
150c0 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
150d0 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
150e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
150f0 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
15100 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
15110 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
15120 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15130 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
15140 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
15150 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
15160 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
15170 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
15180 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
15190 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
151a0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
151b0 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
151c0 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
151d0 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
151e0 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
151f0 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
15200 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
15210 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72  D.** any any for
15220 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
15230 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
15240 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
15250 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
15260 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
15270 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
15280 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
15290 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
152a0 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
152b0 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
152c0 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
152d0 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
152e0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
152f0 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
15300 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
15310 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
15320 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
15330 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
15340 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
15350 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
15360 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
15370 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
15380 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
15390 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
153a0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
153b0 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
153c0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
153d0 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
153e0 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d  ot = pread64(id-
153f0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
15400 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
15410 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
15420 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
15430 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
15440 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
15450 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
15460 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
15470 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
15480 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
15490 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
154a0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
154b0 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
154c0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
154d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
154e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
154f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15500 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
15510 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
15520 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
15530 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
15540 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
15550 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
15560 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
15570 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
15580 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
15590 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  rno;.  }.  OSTRA
155a0 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE5("READ    %-3
155b0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
155c0 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
155d0 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
155e0 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72  LAPSED);.  retur
155f0 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
15600 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
15610 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
15620 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
15630 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
15640 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
15650 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
15660 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
15670 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
15680 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
15690 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
156a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
156b0 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
156c0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
156d0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
156e0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74   offset.){.  int
156f0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
15700 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 65 76 65  id );..  /* Neve
15710 72 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  r read or write 
15720 61 6e 79 20 6f 66 20 74 68 65 20 62 79 74 65 73  any of the bytes
15730 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15740 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
15750 74 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  t( ((unixFile*)i
15760 64 29 2d 3e 69 73 4c 6f 63 6b 61 62 6c 65 3d 3d  d)->isLockable==
15770 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6f  0.          || o
15780 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
15790 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 20  YTE+512.        
157a0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
157b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 29 3b  =PENDING_BYTE );
157c0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
157d0 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
157e0 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  )id, offset, pBu
157f0 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
15800 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
15810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15820 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
15830 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
15840 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
15850 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
15860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15870 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
15880 73 65 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  se{.    ((unixFi
15890 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
158a0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
158b0 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
158c0 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
158d0 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
158e0 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
158f0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
15900 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
15910 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
15920 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
15930 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
15940 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
15950 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
15960 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
15970 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
15980 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
15990 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
159a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
159b0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
159c0 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
159d0 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
159e0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
159f0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
15a00 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
15a10 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
15a20 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15a30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
15a40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15a50 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
15a60 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
15a70 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
15a80 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
15a90 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
15aa0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
15ab0 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
15ac0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
15ad0 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77  READ).  got = pw
15ae0 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
15af0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
15b00 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
15b10 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74  E_PREAD64).  got
15b20 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e   = pwrite64(id->
15b30 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
15b40 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e  fset);.#else.  n
15b50 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
15b60 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
15b70 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28  SEEK_SET);.  if(
15b80 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
15b90 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65  et ){.    if( ne
15ba0 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
15bb0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15bc0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15bd0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
15be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e  else{.      ((un
15bf0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
15c00 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20  tErrno = 0;.... 
15c10 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15c20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20  -1;.  }.  got = 
15c30 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
15c40 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
15c50 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
15c60 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15c70 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15c80 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
15c90 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  no;.  }..  OSTRA
15ca0 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE5("WRITE   %-3
15cb0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
15cc0 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
15cd0 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
15ce0 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72  LAPSED);.  retur
15cf0 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n got;.}.../*.**
15d00 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
15d10 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
15d20 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
15d30 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
15d40 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
15d50 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
15d60 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
15d70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
15d80 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
15d90 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
15da0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
15db0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
15dc0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
15dd0 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65   .){.  int wrote
15de0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
15df0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
15e00 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4e  amt>0 );..  /* N
15e10 65 76 65 72 20 72 65 61 64 20 6f 72 20 77 72 69  ever read or wri
15e20 74 65 20 61 6e 79 20 6f 66 20 74 68 65 20 62 79  te any of the by
15e30 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
15e40 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  ng range */.  as
15e50 73 65 72 74 28 20 28 28 75 6e 69 78 46 69 6c 65  sert( ((unixFile
15e60 2a 29 69 64 29 2d 3e 69 73 4c 6f 63 6b 61 62 6c  *)id)->isLockabl
15e70 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  e==0.          |
15e80 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
15e90 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
15ea0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
15eb0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
15ec0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   );..#ifndef NDE
15ed0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
15ee0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
15ef0 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
15f00 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
15f10 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
15f20 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
15f30 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
15f40 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
15f50 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
15f60 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
15f70 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
15f80 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15f90 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15fa0 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
15fb0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
15fc0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15fd0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
15fe0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
15ff0 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
16000 69 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  if( ((unixFile*)
16010 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  id)->inNormalWri
16020 74 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  te ){.    unixFi
16030 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16040 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
16050 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
16060 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
16070 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
16080 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
16090 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
160a0 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
160b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
160c0 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
160d0 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
160e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
160f0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
16100 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
16110 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
16120 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
16130 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16140 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
16150 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
16160 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
16170 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
16180 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
16190 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
161a0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
161b0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
161c0 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
161d0 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
161e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
161f0 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  if..  while( amt
16200 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
16210 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69  eekAndWrite((uni
16220 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65  xFile*)id, offse
16230 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
16240 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
16250 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
16260 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
16270 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
16280 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
16290 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
162a0 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
162b0 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
162c0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
162d0 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
162e0 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d  t=1 ));.  if( am
162f0 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
16300 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  rote<0 ){.      
16310 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
16320 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
16330 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
16340 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
16350 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
16360 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
16370 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
16380 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
16390 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
163a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
163b0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
163c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
163d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
163e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
163f0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
16400 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
16410 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
16420 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
16430 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
16440 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
16450 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
16460 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
16470 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
16480 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
16490 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
164a0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
164b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
164c0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
164d0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
164e0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
164f0 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
16500 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
16510 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
16520 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
16530 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
16540 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a  ower) fsync()..*
16550 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  * If you know th
16560 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
16570 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
16580 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
16590 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
165a0 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
165b0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
165c0 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
165d0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20  ined(fdatasync) 
165e0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69  && !defined(__li
165f0 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
16600 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
16610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
16620 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
16630 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
16640 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
16650 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
16660 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
16670 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
16680 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
16690 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
166a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
166b0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
166c0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
166d0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
166e0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
166f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
16700 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
16710 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
16720 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
16730 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
16740 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
16750 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
16760 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
16770 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
16780 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
16790 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
167a0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
167b0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
167c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
167d0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
167e0 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
167f0 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
16800 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
16810 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
16820 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
16830 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
16840 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
16850 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
16860 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
16870 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
16880 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
16890 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
168a0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
168b0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
168c0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
168d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
168e0 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
168f0 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
16900 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
16910 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
16920 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
16930 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
16940 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
16950 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
16960 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
16970 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
16980 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
16990 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
169a0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
169b0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
169c0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
169d0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
169e0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
169f0 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
16a00 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
16a10 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
16a20 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
16a30 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
16a40 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
16a50 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
16a60 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
16a70 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
16a80 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
16a90 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
16aa0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
16ab0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
16ac0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
16ad0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
16ae0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
16af0 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
16b00 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
16b10 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
16b20 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
16b30 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
16b40 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
16b50 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
16b60 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
16b70 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
16b80 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
16b90 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
16ba0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
16bb0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
16bc0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
16bd0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
16be0 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
16bf0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
16c00 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
16c10 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
16c20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
16c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
16c40 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
16c50 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
16c60 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
16c70 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
16c80 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
16c90 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
16ca0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
16cb0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
16cc0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
16cd0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
16ce0 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
16cf0 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
16d00 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
16d10 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
16d20 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
16d30 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
16d40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16d50 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
16d60 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
16d70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16d80 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
16d90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
16da0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
16db0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
16dc0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
16dd0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
16de0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16df0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
16e00 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
16e10 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
16e20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
16e30 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
16e40 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
16e50 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
16e60 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
16e70 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
16e80 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
16e90 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
16ea0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
16eb0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
16ec0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
16ed0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
16ee0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
16ef0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
16f00 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
16f10 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16f20 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
16f30 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
16f40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
16f50 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
16f60 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
16f70 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
16f80 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
16f90 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
16fa0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
16fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16fc0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
16fd0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
16fe0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
16ff0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
17000 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
17010 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
17020 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
17030 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
17040 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
17050 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
17060 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
17070 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
17080 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
17090 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
170a0 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
170b0 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
170c0 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
170d0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
170e0 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
170f0 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
17100 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
17110 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
17120 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
17130 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
17140 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
17150 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
17160 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
17170 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
17180 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
17190 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
171a0 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
171b0 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
171c0 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
171d0 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
171e0 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
171f0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
17200 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
17210 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
17220 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
17230 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
17240 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
17250 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
17260 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
17270 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
17280 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
17290 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
172a0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
172b0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
172c0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
172d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
172e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
172f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
17300 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
17310 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
17320 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
17330 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
17340 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
17350 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
17360 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
17370 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
17380 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
17390 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
173a0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
173b0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
173c0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
173d0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
173e0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
173f0 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
17400 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
17410 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
17420 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
17430 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
17440 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
17450 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
17460 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
17470 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
17480 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
17490 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
174a0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
174b0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
174c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
174d0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
174e0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
174f0 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
17500 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
17510 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
17520 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
17530 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
17540 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
17550 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
17560 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
17570 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
17580 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17590 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
175a0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
175b0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
175c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
175d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
175e0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
175f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
17600 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
17610 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17620 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17630 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
17640 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
17650 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
17660 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
17670 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
17680 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17690 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
176a0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
176b0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
176c0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
176d0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
176e0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
176f0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
17700 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
17710 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
17720 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
17730 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
17740 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
17750 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
17760 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
17770 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
17780 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
17790 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
177a0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
177b0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
177c0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
177d0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
177e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
177f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17800 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
17810 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
17820 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
17830 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
17840 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
17850 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
17860 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17870 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
17880 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
17890 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
178a0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
178b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
178c0 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
178d0 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
178e0 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20  {.    int err;. 
178f0 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52     OSTRACE4("DIR
17900 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f  SYNC %-3d (have_
17910 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
17920 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
17930 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20  ile->dirfd,.    
17940 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
17950 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
17960 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nc);.#ifndef SQL
17970 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
17980 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
17990 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
179a0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
179b0 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
179c0 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
179d0 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
179e0 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
179f0 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
17a00 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
17a10 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
17a20 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
17a30 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
17a40 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
17a50 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e  NC || !isFullsyn
17a60 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
17a70 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
17a80 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
17a90 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
17aa0 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
17ab0 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
17ac0 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
17ad0 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
17ae0 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
17af0 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
17b00 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
17b10 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
17b20 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
17b30 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
17b40 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
17b50 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
17b60 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
17b70 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
17b80 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
17b90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
17ba0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17bb0 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20  o = errno; */.  
17bc0 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
17bd0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
17be0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
17bf0 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
17c00 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f  le->dirfd); /* O
17c10 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
17c20 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
17c30 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  the */.    if( e
17c40 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  rr==0 ){        
17c50 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f        /* directo
17c60 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
17c70 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  one */.      pFi
17c80 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
17c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ca0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17cb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
17cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
17cd0 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
17ce0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17cf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
17d00 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
17d10 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
17d20 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
17d30 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
17d40 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
17d50 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
17d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
17d70 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
17d80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
17d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17da0 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
17db0 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
17dc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17dd0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
17de0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17df0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17e00 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17e10 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
17e20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
17e30 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
17e40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17e50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
17e60 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
17e70 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
17e80 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
17e90 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
17ea0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
17eb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17ec0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
17ed0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
17ee0 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
17ef0 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
17f00 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
17f10 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
17f20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17f30 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
17f40 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
17f50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17f60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
17f70 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
17f80 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
17f90 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
17fa0 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
17fb0 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
17fc0 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
17fd0 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c  abase, the findL
17fe0 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  ockInfo() proced
17ff0 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
18000 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
18010 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
18020 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
18030 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
18040 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
18050 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
18060 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
18070 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
18080 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
18090 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
180a0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
180b0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
180c0 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
180d0 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
180e0 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
180f0 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
18100 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
18110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18120 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
18130 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18140 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
18150 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
18160 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
18170 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
18180 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
18190 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
181a0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
181b0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
181c0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
181d0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
181e0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
181f0 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
18200 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  endif.../*.** In
18210 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
18220 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
18230 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
18240 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18250 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
18260 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18270 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
18280 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
18290 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
182a0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
182b0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
182c0 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
182d0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
182e0 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
182f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18300 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18310 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
18320 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
18330 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a  rg = ((unixFile*
18340 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
18350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
18370 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18380 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
18390 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
183a0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
183b0 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
183c0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
183d0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
183e0 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
183f0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
18400 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
18410 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
18420 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
18430 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
18440 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
18450 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
18460 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
18470 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
18480 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
18490 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
184a0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
184b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
184c0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
184d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
184e0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
184f0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
18500 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18510 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
18520 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
18530 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
18540 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
18550 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
18560 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
18570 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
18580 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
18590 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
185a0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
185b0 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
185c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
185d0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
185e0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
185f0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
18600 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
18610 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
18620 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
18630 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
18640 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
18650 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
18660 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
18670 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
18680 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
18690 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
186a0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
186b0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
186c0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
186d0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
186e0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
186f0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
18700 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
18710 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
18720 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
18730 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
18740 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
18750 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
18760 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
18770 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
18780 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
18790 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
187a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
187b0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
187c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
187d0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
187e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
187f0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
18800 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
18810 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  e. This is alway
18820 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  s 0 for unix..*/
18830 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18840 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
18850 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
18860 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
18870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18880 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
18890 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
188a0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
188b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
188c0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
188d0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 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 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
18900 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
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 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
18980 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
18990 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
189a0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
189b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
189c0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
189d0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
189e0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
189f0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
18a00 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
18a10 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
18a20 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
18a30 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
18a40 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
18a50 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
18a60 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
18a70 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
18a80 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
18a90 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
18aa0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
18ab0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
18ac0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
18ad0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
18ae0 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
18af0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
18b00 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
18b10 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
18b20 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
18b30 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
18b40 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
18b50 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
18b60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
18b70 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
18b80 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
18b90 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
18ba0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
18bb0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
18bc0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
18bd0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
18be0 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
18bf0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
18c00 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
18c10 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
18c20 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
18c30 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
18c40 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
18c50 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
18c60 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
18c70 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
18c80 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
18c90 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
18ca0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
18cb0 63 74 69 6f 20 6e 61 6d 65 64 20 6a 75 73 74 20  ctio named just 
18cc0 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
18cd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
18ce0 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
18cf0 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
18d00 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
18d10 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
18d20 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
18d30 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
18d40 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
18d50 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
18d60 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
18d70 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
18d80 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
18d90 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
18da0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
18db0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
18dc0 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
18dd0 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
18de0 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
18df0 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
18e00 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
18e10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
18e20 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
18e30 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
18e40 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
18e50 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
18e60 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
18e70 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
18e80 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
18e90 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
18ea0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
18eb0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
18ec0 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
18ed0 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
18ee0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
18ef0 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
18f00 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
18f10 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 43 4c  NDER, METHOD, CL
18f20 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
18f30 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
18f40 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
18f50 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
18f60 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
18f70 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 31 2c 20          \.   1, 
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
18fc0 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
18ff0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
19000 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
19010 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
19040 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
19050 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
19060 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
19090 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
190a0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
190b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
190e0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
190f0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
19100 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
19130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19140 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
19180 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
19190 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
191a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19260 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19280 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
19290 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
192b0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
192c0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
192d0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
192e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19300 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
19310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19320 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19350 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
19360 63 74 65 72 69 73 74 69 63 73 20 20 20 2f 2a 20  cteristics   /* 
19370 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
19380 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
19390 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 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 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
193f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
19400 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
19410 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
19420 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 68 29 7b  char *z, int h){
19430 20 20 20 20 20 20 20 20 20 5c 0a 20 20 55 4e 55           \.  UNU
19440 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
19450 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
19460 45 52 28 68 29 3b 20 20 20 20 20 20 20 20 20 20  ER(h);          
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 5c 0a 20 20 72 65 74 75          \.  retu
19490 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
194a0 20 20 20 20 20 20 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 5c 0a 7d 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
19530 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
19540 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
19550 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
19560 68 61 72 2a 2c 69 6e 74 29 20 20 20 20 20 20 20  har*,int)       
19570 20 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e       \.    = FIN
19580 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
19590 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
195a0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
195b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
195c0 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
195d0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
195e0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
195f0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
19600 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
19610 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
19620 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
19630 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
19640 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
19650 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
19660 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
19670 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
19680 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
19690 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
196a0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
196b0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
196e0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
19710 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19730 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
19740 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
19750 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
19760 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
19770 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
19780 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
19790 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
197a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
197b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
197c0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
197d0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
197e0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
197f0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
19800 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  e */.  nolockClo
19810 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
19820 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
19830 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
19840 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
19850 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
19860 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
19870 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
19880 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
19890 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
198a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
198b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
198c0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
198d0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
198e0 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
198f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
19900 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
19910 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
19920 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
19930 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
19940 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
19950 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  me */.  dotlockC
19960 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
19970 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
19980 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
19990 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
199a0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
199b0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
199c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
199d0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
199e0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
199f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19a00 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
19a10 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
19a20 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
19a30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19a40 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
19a50 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
19a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19a70 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
19a80 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
19a90 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
19aa0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
19ab0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
19ac0 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  name */.  flockC
19ad0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
19ae0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
19af0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
19b00 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
19b10 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
19b20 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
19b30 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
19b40 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
19b50 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
19b60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19b70 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
19b80 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
19b90 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
19ba0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
19bb0 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
19bc0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
19bd0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
19be0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
19bf0 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
19c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
19c10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
19c20 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
19c30 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
19c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19c50 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
19c60 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
19c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19c80 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
19c90 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
19ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
19cb0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
19cc0 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
19cd0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
19ce0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19cf0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
19d00 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
19d10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
19d20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
19d30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
19d40 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
19d50 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
19d60 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
19d70 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
19d80 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
19d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
19da0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
19db0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
19dc0 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
19dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
19de0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
19df0 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
19e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
19e10 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
19e20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
19e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
19e40 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
19e50 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
19e60 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
19e70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19e80 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
19e90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
19ea0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
19eb0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
19ec0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
19ed0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
19ee0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
19ef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19f00 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
19f10 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
19f20 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
19f30 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
19f40 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
19f50 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
19f60 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
19f70 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
19f80 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
19f90 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
19fa0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
19fb0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
19fc0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
19fd0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
19fe0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
19ff0 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
1a000 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
1a010 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a020 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
1a030 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
1a040 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
1a050 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
1a060 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
1a070 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
1a080 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1a090 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1a0a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1a0b0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
1a0c0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
1a0d0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1a0e0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
1a0f0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1a100 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
1a110 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
1a120 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
1a130 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1a140 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a150 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
1a160 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
1a170 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
1a180 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
1a190 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1a1a0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
1a1b0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
1a1c0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1a1d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1a1e0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  ct name */.  pro
1a1f0 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
1a200 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1a210 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
1a220 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
1a230 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1a240 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
1a250 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
1a260 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1a270 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
1a280 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
1a290 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
1a2a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1a2b0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1a2c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1a2d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1a2e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1a2f0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
1a300 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
1a310 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1a320 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a330 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
1a340 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
1a350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a360 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
1a370 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
1a380 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a390 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
1a3a0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
1a3b0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
1a3c0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
1a3d0 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
1a3e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1a3f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1a400 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1a410 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
1a420 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
1a430 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
1a440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1a450 0a 20 20 69 6e 74 20 66 64 20 20 20 20 20 20 20  .  int fd       
1a460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1a470 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
1a480 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
1a490 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
1a4a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1a4b0 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
1a4c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a4d0 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
1a4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a4f0 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
1a500 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
1a510 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1a520 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
1a530 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
1a540 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
1a550 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
1a560 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
1a570 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
1a580 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
1a590 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1a5a0 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
1a5b0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
1a5c0 73 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  s },.#ifdef SQLI
1a5d0 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50 5f 4c 4f  TE_ENABLE_AFP_LO
1a5e0 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20 20 7b 20  CKING_SMB.    { 
1a5f0 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
1a600 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6c 73 65  Methods },.#else
1a610 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
1a620 20 26 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   &flockIoMethods
1a630 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b   },.#endif.    {
1a640 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
1a650 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
1a660 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
1a670 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1a680 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
1a690 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
1a6a0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
1a6b0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
1a6c0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
1a6d0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
1a6e0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1a6f0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
1a700 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
1a710 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1a720 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
1a730 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
1a740 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1a750 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
1a760 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
1a770 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
1a780 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
1a790 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
1a7a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a7b0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1a7c0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
1a7d0 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
1a7e0 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
1a7f0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1a800 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
1a810 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
1a820 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
1a830 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1a840 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
1a850 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
1a860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
1a870 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
1a880 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
1a890 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
1a8a0 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
1a8b0 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
1a8c0 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
1a8d0 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
1a8e0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
1a8f0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
1a900 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
1a910 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
1a920 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
1a930 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
1a940 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
1a950 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
1a960 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
1a970 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
1a980 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
1a990 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
1a9a0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
1a9b0 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70   {.    return &p
1a9c0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
1a9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
1a9e0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
1a9f0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
1aa00 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1aa10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
1aa20 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
1aa30 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
1aa40 72 2a 2c 69 6e 74 29 0a 20 20 20 20 20 20 20 20  r*,int).        
1aa50 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
1aa60 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
1aa70 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1aa80 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1aa90 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1aaa0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
1aab0 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
1aac0 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
1aad0 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
1aae0 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
1aaf0 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
1ab00 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1ab10 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
1ab20 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
1ab30 74 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  t);.../*********
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 0a 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 2a 2a 2a  ****************
1aba0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1abb0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abd0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1abe0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1abf0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1ac00 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1ac10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1ac20 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
1ac30 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1ac40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1ac50 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
1ac60 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1ac70 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
1ac80 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
1ac90 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
1aca0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1acb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1acc0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
1acd0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
1ace0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1acf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ad00 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
1ad10 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
1ad20 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
1ad30 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
1ad40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1ad50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1ad60 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
1ad70 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
1ad80 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
1ad90 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1ada0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1adb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1adc0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
1add0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
1ade0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
1adf0 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
1ae00 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
1ae10 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
1ae20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1ae30 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1ae40 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
1ae50 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1ae60 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
1ae70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1ae80 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
1ae90 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
1aea0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1aeb0 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ert( pNew->pLock
1aec0 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ==NULL );.  asse
1aed0 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d  rt( pNew->pOpen=
1aee0 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
1aef0 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
1af00 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
1af10 6e 20 76 78 77 6f 72 6b 73 2e 0a 20 20 2a 2a 20  n vxworks..  ** 
1af20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70  Express this exp
1af30 6c 69 63 69 74 6c 79 20 68 65 72 65 20 74 6f 20  licitly here to 
1af40 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
1af50 20 77 61 72 6e 69 6e 67 73 0a 20 20 2a 2a 20 61   warnings.  ** a
1af60 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
1af70 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 23 69 66  meters..  */.#if
1af80 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 55   !OS_VXWORKS.  U
1af90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1afa0 69 73 44 65 6c 65 74 65 29 3b 0a 23 65 6e 64 69  isDelete);.#endi
1afb0 66 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f  f..  OSTRACE3("O
1afc0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
1afd0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
1afe0 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20  ;    .  pNew->h 
1aff0 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72  = h;.  pNew->dir
1b000 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45  fd = dirfd;.  SE
1b010 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29  T_THREADID(pNew)
1b020 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
1b030 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
1b040 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
1b050 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
1b060 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
1b070 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d   ){.    noLock =
1b080 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
1b090 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
1b0a0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c  endif..  if( noL
1b0b0 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
1b0c0 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
1b0d0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1b0e0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
1b0f0 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
1b100 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
1b110 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
1b120 6e 61 6d 65 2c 20 68 29 3b 0a 23 69 66 20 53 51  name, h);.#if SQ
1b130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1b140 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
1b150 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
1b160 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1b170 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
1b180 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
1b190 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
1b1a0 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
1b1b0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
1b1c0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
1b1d0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
1b1e0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
1b1f0 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
1b200 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
1b210 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
1b220 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
1b230 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
1b240 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
1b250 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1b260 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
1b270 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
1b280 68 6f 64 73 20 29 7b 0a 20 20 20 20 75 6e 69 78  hods ){.    unix
1b290 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b2a0 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1b2b0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1b2c0 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1b2d0 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c  Open);.    unixL
1b2e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
1b2f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1b300 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1b310 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1b320 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
1b330 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1b340 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
1b350 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
1b360 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
1b370 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
1b380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
1b390 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
1b3a0 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
1b3b0 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
1b3c0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
1b3d0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
1b3e0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
1b3f0 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
1b400 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1b410 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
1b420 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
1b430 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b440 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1b450 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
1b460 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
1b470 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
1b480 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
1b490 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
1b4a0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
1b4b0 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
1b4c0 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
1b4d0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
1b4e0 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
1b4f0 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
1b500 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
1b510 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
1b520 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 73 72 61  ename;.      sra
1b530 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
1b540 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1b550 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
1b560 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c  ndLockInfo(pNew,
1b570 20 4e 55 4c 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f   NULL, &pNew->pO
1b580 70 65 6e 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  pen);.      unix
1b590 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
1b5a0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
1b5b0 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
1b5c0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1b5d0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
1b5e0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
1b5f0 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
1b600 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
1b610 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
1b620 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
1b630 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
1b640 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
1b650 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
1b660 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
1b670 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
1b680 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
1b690 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
1b6a0 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
1b6b0 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
1b6c0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
1b6d0 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
1b6e0 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
1b6f0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
1b700 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1b710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b720 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1b730 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
1b740 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
1b750 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
1b760 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
1b770 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
1b780 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
1b790 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
1b7a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
1b7b0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
1b7c0 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
1b7d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
1b7e0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
1b7f0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1b800 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1b810 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1b820 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
1b830 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
1b840 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
1b850 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1b860 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
1b870 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  ockInfo(pNew, &p
1b880 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
1b890 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  w->pOpen);.    i
1b8a0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
1b8b0 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70  K) && (pNew->pOp
1b8c0 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  en->pSem==NULL) 
1b8d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1b8e0 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
1b8f0 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b  pOpen->aSemName;
1b900 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1b910 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1b920 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1b930 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 25 73  E, zSemName, "%s
1b940 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1b960 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
1b970 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
1b980 66 6f 72 28 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61  for( n=0; zSemNa
1b990 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
1b9a0 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
1b9b0 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
1b9c0 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
1b9d0 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e       pNew->pOpen
1b9e0 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
1b9f0 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
1ba00 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
1ba10 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
1ba20 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  Open->pSem == SE
1ba30 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
1ba40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ba50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
1ba60 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d  New->pOpen->aSem
1ba70 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
1ba80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ba90 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1baa0 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
1bab0 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72   .  pNew->lastEr
1bac0 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  rno = 0;.#if OS_
1bad0 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1bae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1baf0 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
1bb00 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
1bb10 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
1bb20 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
1bb30 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
1bb40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bb50 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
1bb60 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
1bb70 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
1bb80 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  t leak if fail, 
1bb90 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
1bba0 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 68 29   */.    close(h)
1bbb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1bbc0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
1bbd0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
1bbe0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
1bbf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1bc00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1bc10 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1bc20 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1bc30 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1bc40 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1bc50 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1bc60 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1bc70 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1bc80 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1bc90 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1bca0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1bcb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1bcc0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1bcd0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1bce0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1bcf0 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1bd00 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1bd10 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1bd20 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1bd30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1bd40 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1bd50 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1bd60 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1bd70 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1bd80 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1bd90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1bda0 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1bdb0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1bdc0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1bdd0 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1bde0 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1bdf0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1be00 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1be10 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1be20 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1be30 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1be40 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1be50 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1be60 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1be70 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1be80 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1be90 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1bea0 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1beb0 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72    fd = open(zDir
1bec0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1bed0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1bee0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
1bef0 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
1bf00 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20        fcntl(fd, 
1bf10 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
1bf20 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
1bf30 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
1bf40 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
1bf50 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
1bf60 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1bf70 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rname);.    }.  
1bf80 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1bf90 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
1bfa0 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f  QLITE_OK:SQLITE_
1bfb0 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a  CANTOPEN);.}../*
1bfc0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
1bfd0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
1bfe0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
1bff0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
1c000 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
1c010 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
1c020 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
1c030 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
1c040 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
1c050 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
1c060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1c070 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1c080 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
1c090 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1c0a0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
1c0b0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
1c0c0 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
1c0d0 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
1c0e0 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
1c0f0 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
1c100 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1c110 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
1c120 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
1c130 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
1c140 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
1c150 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
1c160 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
1c170 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
1c180 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
1c190 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1c1a0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
1c1b0 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20   *zDir = ".";.. 
1c1c0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
1c1d0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
1c1e0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
1c1f0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
1c200 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
1c210 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
1c220 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
1c230 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
1c240 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
1c250 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
1c260 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
1c270 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1c280 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
1c290 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  ;..  azDirs[0] =
1c2a0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
1c2b0 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e  rectory;.  if (N
1c2c0 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d  ULL == azDirs[1]
1c2d0 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31  ) {.    azDirs[1
1c2e0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
1c2f0 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66  IR");.  }.  .  f
1c300 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
1c310 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
1c320 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29  azDirs[0]); i++)
1c330 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73  {.    if( azDirs
1c340 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1c350 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  e;.    if( stat(
1c360 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29  azDirs[i], &buf)
1c370 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c380 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
1c390 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
1c3a0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61  tinue;.    if( a
1c3b0 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c  ccess(azDirs[i],
1c3c0 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
1c3d0 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69  .    zDir = azDi
1c3e0 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b  rs[i];.    break
1c3f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1c400 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
1c410 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
1c420 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
1c430 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1c440 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
1c450 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
1c460 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
1c470 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
1c480 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
1c490 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
1c4a0 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
1c4b0 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
1c4c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c4d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1c4e0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
1c4f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
1c500 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
1c510 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
1c520 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
1c530 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
1c540 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
1c550 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1c560 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
1c570 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c580 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
1c590 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
1c5a0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
1c5b0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
1c5c0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
1c5d0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
1c5e0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
1c5f0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63  0;.  }while( acc
1c600 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
1c610 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c620 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1c630 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1c640 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1c650 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1c660 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
1c670 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
1c680 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
1c690 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
1c6a0 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
1c6b0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
1c6c0 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
1c6d0 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
1c6e0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
1c6f0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
1c700 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
1c710 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
1c720 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
1c730 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
1c740 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
1c750 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  r*);.#endif.../*
1c760 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
1c770 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
1c780 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
1c790 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
1c7a0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
1c7b0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
1c7c0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
1c7d0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
1c7e0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
1c7f0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
1c800 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
1c810 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
1c820 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
1c830 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
1c840 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
1c850 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1c860 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
1c870 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
1c880 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
1c890 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
1c8a0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
1c8b0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
1c8c0 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
1c8d0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
1c8e0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
1c8f0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
1c900 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
1c910 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
1c920 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
1c930 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
1c940 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
1c950 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
1c960 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
1c970 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
1c980 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
1c990 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
1c9a0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
1c9b0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
1c9c0 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
1c9d0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
1c9e0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
1c9f0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
1ca00 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
1ca10 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
1ca20 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
1ca30 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
1ca40 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
1ca50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ca60 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
1ca70 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
1ca80 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
1ca90 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
1caa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1cab0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
1cac0 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
1cad0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
1cae0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1caf0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
1cb00 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1cb10 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
1cb20 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
1cb30 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
1cb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1cb50 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
1cb60 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
1cb70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
1cb80 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1cb90 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
1cba0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
1cbb0 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
1cbc0 0a 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20  .  int fd = 0;  
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbe0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1cbf0 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
1cc00 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
1cc10 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20   dirfd = -1;    
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1cc30 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1cc40 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
1cc50 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc70 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
1cc80 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
1cc90 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
1cca0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
1ccb0 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
1ccc0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
1ccd0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1cce0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ccf0 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
1cd00 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
1cd10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cd20 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  OK;..  int isExc
1cd30 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
1cd40 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
1cd50 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
1cd60 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
1cd70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1cd80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1cd90 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
1cda0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
1cdb0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
1cdc0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
1cdd0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
1cde0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1cdf0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
1ce00 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
1ce10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1ce20 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1ce30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  );..  /* If crea
1ce40 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
1ce50 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
1ce60 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
1ce70 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
1ce80 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
1ce90 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
1cea0 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
1ceb0 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
1cec0 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
1ced0 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
1cee0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1cef0 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
1cf00 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
1cf10 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65    */.  int isOpe
1cf20 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73  nDirectory = (is
1cf30 43 72 65 61 74 65 20 26 26 20 0a 20 20 20 20 20  Create && .     
1cf40 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f   (eType==SQLITE_
1cf50 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1cf60 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
1cf70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1cf80 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20  OURNAL).  );..  
1cf90 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
1cfa0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
1cfb0 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
1cfc0 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
1cfd0 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
1cfe0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1cff0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
1d000 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1d010 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
1d020 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
1d030 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1d040 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d050 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
1d060 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
1d070 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1d080 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
1d090 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
1d0a0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
1d0b0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
1d0c0 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
1d0d0 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
1d0e0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
1d0f0 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
1d100 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
1d110 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
1d120 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
1d130 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
1d140 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
1d150 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
1d160 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
1d170 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
1d180 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
1d190 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1d1a0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1d1b0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
1d1c0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
1d1d0 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
1d1e0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
1d1f0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
1d200 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
1d210 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
1d220 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
1d230 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1d240 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
1d250 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
1d260 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
1d270 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
1d280 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  al, and master j
1d290 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
1d2a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
1d2b0 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f   ** deleted.  */
1d2c0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1d2d0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1d2e0 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65  IN_DB || !isDele
1d2f0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
1d300 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1d310 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1d320 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
1d330 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
1d340 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
1d350 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21  TER_JOURNAL || !
1d360 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  isDelete );..  /
1d370 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
1d380 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
1d390 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
1d3a0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
1d3b0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
1d3c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1d3d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
1d3e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1d3f0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
1d400 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
1d410 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1d420 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
1d430 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1d440 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
1d450 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1d460 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1d470 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
1d480 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1d490 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
1d4a0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1d4b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1d4c0 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
1d4d0 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
1d4e0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
1d4f0 29 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d  ));..  if( !zNam
1d500 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1d510 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
1d520 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
1d530 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
1d540 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame(MAX_PATHNAME
1d550 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +1, zTmpname);. 
1d560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d590 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
1d5a0 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ame;.  }..  if( 
1d5b0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
1d5c0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
1d5d0 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
1d5e0 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
1d5f0 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
1d600 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
1d610 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
1d620 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
1d630 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
1d640 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
1d650 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
1d660 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
1d670 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
1d680 52 59 29 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65  RY);..  fd = ope
1d690 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
1d6a0 67 73 2c 20 69 73 44 65 6c 65 74 65 3f 30 36 30  gs, isDelete?060
1d6b0 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  0:SQLITE_DEFAULT
1d6c0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1d6d0 53 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22  S);.  OSTRACE4("
1d6e0 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
1d6f0 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
1d700 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20  e, openFlags);. 
1d710 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
1d720 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
1d730 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
1d740 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1d750 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
1d760 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
1d770 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
1d780 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
1d790 2e 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26  . */.    flags &
1d7a0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
1d7b0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1d7c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
1d7d0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
1d7e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d7f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1d800 78 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74  xOpen(pVfs, zPat
1d810 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c  h, pFile, flags,
1d820 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d   pOutFlags);.  }
1d830 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
1d840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d850 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
1d860 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
1d870 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1d880 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
1d890 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c  e;.#else.    unl
1d8a0 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
1d8b0 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
1d8c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1d8d0 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
1d8e0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
1d8f0 46 69 6c 65 29 2d 3e 6f 70 65 6e 46 6c 61 67 73  File)->openFlags
1d900 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
1d910 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
1d920 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
1d930 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
1d940 67 73 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  gs;.  }..#ifndef
1d950 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 28 66   NDEBUG.  if( (f
1d960 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1d970 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 29  EN_MAIN_DB)!=0 )
1d980 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1d990 2a 29 70 46 69 6c 65 29 2d 3e 69 73 4c 6f 63 6b  *)pFile)->isLock
1d9a0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  able = 1;.  }.#e
1d9b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 66  ndif..  assert(f
1d9c0 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73 4f  d!=0);.  if( isO
1d9d0 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a  penDirectory ){.
1d9e0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
1d9f0 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64  ectory(zPath, &d
1da00 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1da10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da20 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
1da30 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
1da40 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61  k if fail, alrea
1da50 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  dy in error */. 
1da60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1da70 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1da80 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66  f FD_CLOEXEC.  f
1da90 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
1daa0 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
1dab0 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
1dac0 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  EXEC);.#endif.. 
1dad0 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
1dae0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1daf0 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49 54  N_DB;..#if SQLIT
1db00 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
1db10 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50 61  OCKING.  if( zPa
1db20 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f 4c  th!=NULL && !noL
1db30 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ock ){.    char 
1db40 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
1db50 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
1db60 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
1db70 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
1db80 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
1db90 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
1dba0 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
1dbb0 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
1dbc0 20 75 73 65 20 70 72 6f 78 79 2c 20 0a 20 20 20   use proxy, .   
1dbd0 20 2a 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76 65   ** 0 means neve
1dbe0 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
1dbf0 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
1dc00 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
1dc10 66 69 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20 2a  files only.    *
1dc20 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
1dc30 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
1dc40 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
1dc50 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
1dc60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dc70 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
1dc80 49 6e 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66 28  Info;..      if(
1dc90 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
1dca0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
1dcb0 0a 09 09 09 09 28 28 75 6e 69 78 46 69 6c 65 2a  .....((unixFile*
1dcc0 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
1dcd0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1dce0 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
1dcf0 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b   ) close(dirfd);
1dd00 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
1dd10 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
1dd20 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ror */.        c
1dd30 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
1dd40 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
1dd50 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
1dd60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1dd70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
1dd80 53 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SS;.      }.    
1dd90 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
1dda0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
1ddb0 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
1ddc0 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
1ddd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
1dde0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
1ddf0 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70  fs, fd, dirfd, p
1de00 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
1de10 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a  ock, isDelete);.
1de20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1de30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1de40 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
1de50 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
1de60 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
1de70 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
1de80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1de90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
1dea0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
1deb0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
1dec0 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  (pVfs, fd, dirfd
1ded0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
1dee0 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65  noLock, isDelete
1def0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
1df00 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
1df10 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
1df20 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
1df30 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
1df40 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1df50 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
1df60 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
1df70 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
1df80 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1df90 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
1dfa0 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
1dfb0 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
1dfc0 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
1dfd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1dfe0 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
1dff0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
1e000 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
1e010 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
1e020 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1e030 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
1e040 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
1e050 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
1e060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e070 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
1e080 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1e090 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1e0a0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
1e0b0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
1e0c0 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68  ;.  unlink(zPath
1e0d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1e0e0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
1e0f0 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20  C.  if( dirSync 
1e100 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
1e110 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
1e120 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
1e130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
1e150 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
1e160 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
1e170 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
1e180 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
1e190 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1e1a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e1b0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
1e1c0 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
1e1d0 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29     if( close(fd)
1e1e0 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  &&!rc ){.       
1e1f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1e200 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
1e210 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e220 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1e230 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
1e240 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
1e250 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
1e260 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
1e270 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
1e280 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
1e290 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
1e2a0 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
1e2b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
1e2c0 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
1e2d0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
1e2e0 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
1e2f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
1e300 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
1e310 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
1e320 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
1e330 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
1e340 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
1e350 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
1e360 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
1e370 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
1e380 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
1e390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e3a0 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
1e3b0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1e3c0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
1e3d0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
1e3e0 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
1e3f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1e400 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
1e410 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
1e420 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
1e430 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
1e440 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
1e450 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
1e460 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
1e470 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
1e480 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
1e490 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
1e4a0 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
1e4b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
1e4c0 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
1e4d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1e4e0 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
1e4f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1e500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1e510 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
1e520 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
1e530 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1e540 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
1e550 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
1e560 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1e570 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1e580 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
1e590 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
1e5a0 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
1e5b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1e5c0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
1e5d0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
1e5e0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
1e5f0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1e600 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
1e610 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
1e620 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
1e630 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73  ResOut = (access
1e640 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
1e650 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
1e660 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1e670 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
1e680 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
1e690 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
1e6a0 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
1e6b0 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
1e6c0 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
1e6d0 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
1e6e0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1e6f0 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
1e700 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
1e710 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1e720 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
1e730 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
1e740 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
1e750 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
1e760 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
1e770 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
1e780 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
1e790 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
1e7a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1e7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e7c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
1e7d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e7e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
1e7f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
1e800 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
1e810 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
1e820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
1e830 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
1e840 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
1e850 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e870 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
1e880 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
1e890 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
1e8c0 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
1e8d0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1e8e0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1e8f0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1e900 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1e910 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1e920 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1e930 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1e940 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1e950 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1e960 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
1e970 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
1e980 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
1e990 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
1e9a0 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
1e9b0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
1e9c0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
1e9d0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
1e9e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1e9f0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
1ea00 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
1ea10 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
1ea20 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
1ea30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1ea40 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
1ea50 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
1ea60 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
1ea70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1ea80 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
1ea90 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
1eaa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1eab0 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
1eac0 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  getcwd(zOut, nOu
1ead0 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
1eae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1eaf0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1eb00 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
1eb10 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
1eb20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1eb30 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
1eb40 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
1eb50 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
1eb60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eb70 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1eb80 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1eb90 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
1eba0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
1ebb0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
1ebc0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
1ebd0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
1ebe0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
1ebf0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
1ec00 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
1ec10 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
1ec20 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
1ec30 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
1ec40 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
1ec50 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
1ec60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1ec70 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
1ec80 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1ec90 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
1eca0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
1ecb0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
1ecc0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
1ecd0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1ece0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
1ecf0 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
1ed00 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
1ed10 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
1ed20 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
1ed30 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
1ed40 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
1ed50 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
1ed60 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
1ed70 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
1ed80 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
1ed90 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
1eda0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
1edb0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
1edc0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1edd0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
1ede0 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
1edf0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
1ee00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1ee10 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
1ee20 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
1ee30 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1ee40 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20  BufOut){.  char 
1ee50 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
1ee60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1ee70 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
1ee80 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
1ee90 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
1eea0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
1eeb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1eec0 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
1eed0 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
1eee0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1eef0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1ef00 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
1ef10 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
1ef20 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
1ef30 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
1ef40 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
1ef50 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
1ef60 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
1ef70 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
1ef80 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
1ef90 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
1efa0 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
1efb0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
1efc0 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
1efd0 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
1efe0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
1eff0 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
1f000 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
1f010 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
1f020 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
1f030 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
1f040 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
1f050 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
1f060 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
1f070 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
1f080 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
1f090 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
1f0a0 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
1f0b0 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
1f0c0 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
1f0d0 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
1f0e0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
1f0f0 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
1f100 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
1f110 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
1f120 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
1f130 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
1f140 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
1f150 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
1f160 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
1f170 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
1f180 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
1f190 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
1f1a0 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
1f1b0 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
1f1c0 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
1f1d0 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
1f1e0 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
1f1f0 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
1f200 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
1f210 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
1f220 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
1f230 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
1f240 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
1f250 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
1f260 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
1f270 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
1f280 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
1f290 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
1f2a0 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
1f2b0 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
1f2c0 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1f2d0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1f2e0 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
1f2f0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
1f300 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
1f310 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
1f320 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
1f330 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
1f340 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
1f350 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
1f360 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
1f370 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1f380 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
1f390 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
1f3a0 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
1f3b0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1f3c0 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
1f3d0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
1f3e0 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
1f3f0 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
1f400 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
1f410 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
1f420 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
1f430 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
1f440 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
1f450 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
1f460 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
1f470 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
1f480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1f490 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
1f4a0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
1f4b0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1f4c0 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
1f4d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1f4e0 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
1f4f0 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
1f500 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
1f510 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
1f520 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
1f530 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
1f540 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
1f550 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
1f560 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
1f570 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
1f580 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
1f590 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
1f5a0 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
1f5b0 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
1f5c0 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
1f5d0 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
1f5e0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
1f5f0 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
1f600 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
1f610 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
1f620 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
1f630 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
1f640 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
1f650 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
1f660 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
1f670 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
1f680 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
1f690 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
1f6a0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
1f6b0 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
1f6c0 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
1f6d0 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
1f6e0 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
1f6f0 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
1f700 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
1f710 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
1f720 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
1f730 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
1f740 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
1f750 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
1f760 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
1f770 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
1f780 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
1f790 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
1f7a0 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
1f7b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1f7c0 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
1f7d0 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
1f7e0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
1f7f0 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
1f800 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
1f810 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
1f820 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
1f830 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
1f840 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
1f850 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
1f860 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
1f870 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
1f880 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
1f890 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
1f8a0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1f8b0 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
1f8c0 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
1f8d0 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
1f8e0 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
1f8f0 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
1f900 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72  {.      nBuf = r
1f910 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
1f920 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  uf);.      close
1f930 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
1f940 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1f950 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
1f960 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1f970 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1f980 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1f990 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
1f9a0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1f9b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
1f9c0 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
1f9d0 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
1f9e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1f9f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1fa00 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
1fa10 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
1fa20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
1fa30 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
1fa40 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1fa50 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
1fa60 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
1fa70 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1fa80 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
1fa90 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
1faa0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
1fab0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1fac0 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
1fad0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
1fae0 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
1faf0 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
1fb00 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
1fb10 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
1fb20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
1fb30 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
1fb40 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
1fb50 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
1fb60 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
1fb70 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
1fb80 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
1fb90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1fba0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1fbb0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
1fbc0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
1fbd0 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
1fbe0 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
1fbf0 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
1fc00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1fc10 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1fc20 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
1fc30 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
1fc40 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
1fc50 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
1fc60 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
1fc70 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
1fc80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1fc90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1fca0 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
1fcb0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
1fcc0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1fcd0 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
1fce0 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
1fcf0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
1fd00 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
1fd10 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
1fd20 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
1fd30 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
1fd40 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
1fd50 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
1fd60 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
1fd70 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
1fd80 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1fd90 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
1fda0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
1fdb0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
1fdc0 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
1fdd0 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
1fde0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
1fdf0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
1fe00 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
1fe10 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
1fe20 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
1fe30 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
1fe40 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
1fe50 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
1fe60 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
1fe70 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
1fe80 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
1fe90 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
1fea0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
1feb0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
1fec0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
1fed0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
1fee0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69  uble *prNow){.#i
1fef0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
1ff00 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
1ff10 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
1ff20 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
1ff30 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
1ff40 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
1ff50 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
1ff60 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
1ff70 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
1ff80 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
1ff90 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
1ffa0 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
1ffb0 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
1ffc0 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30  w.tv_nsec/864000
1ffd0 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73  00000000.0;.#els
1ffe0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
1fff0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
20000 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
20010 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
20020 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
20030 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
20040 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
20050 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
20060 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
20070 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
20080 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
20090 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
200a0 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
200b0 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
200c0 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
200d0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
200e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
200f0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
20100 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
20110 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
20120 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
20130 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
20140 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
20150 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
20160 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
20170 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
20180 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
20190 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
201a0 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
201b0 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
201c0 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
201d0 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
201e0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
201f0 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
20200 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
20210 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
20220 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
20230 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
20240 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20250 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
20260 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
20270 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
20280 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
20290 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
202a0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
202b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
202c0 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
202d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
202e0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
202f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a  urn 0;.}../*.***
20300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20310 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
20320 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
20330 20 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 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
203e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
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 20 42 65 67 69 6e 20 50  ******** Begin P
20410 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
20420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20440 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
20450 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
20460 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
20470 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
20480 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
20490 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
204a0 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
204b0 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
204c0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
204d0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
204e0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
204f0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
20500 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
20510 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
20520 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
20530 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
20540 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
20550 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
20560 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
20570 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
20580 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
20590 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
205a0 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
205b0 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
205c0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
205d0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
205e0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
205f0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
20600 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
20610 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
20620 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
20630 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
20640 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
20650 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
20660 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
20670 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
20680 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
20690 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
206a0 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
206b0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
206c0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
206d0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
206e0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
206f0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
20700 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
20710 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
20720 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
20730 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
20740 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
20750 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
20760 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
20770 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
20780 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
20790 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
207a0 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
207b0 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
207c0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
207d0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
207e0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
207f0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
20800 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
20810 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
20820 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
20830 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
20840 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
20850 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
20860 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
20870 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
20880 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
20890 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
208a0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
208b0 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
208c0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
208d0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
208e0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
208f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
20900 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
20910 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
20920 34 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a  40000000..   ..*
20930 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
20940 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
20950 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
20960 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
20970 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
20980 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
20990 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
209a0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
209b0 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
209c0 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
209d0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
209e0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
209f0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
20a00 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
20a10 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
20a20 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
20a30 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
20a40 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
20a50 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
20a60 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
20a70 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
20a80 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
20a90 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
20aa0 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
20ab0 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
20ac0 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
20ad0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
20ae0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
20af0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
20b00 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
20b10 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
20b20 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
20b30 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
20b40 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
20b50 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
20b60 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
20b70 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
20b80 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
20b90 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
20ba0 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
20bb0 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
20bc0 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
20bd0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
20be0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
20bf0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
20c00 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
20c10 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
20c20 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
20c30 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
20c40 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
20c50 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
20c60 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
20c70 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
20c80 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
20c90 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
20ca0 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
20cb0 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
20cc0 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
20cd0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
20ce0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
20cf0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
20d00 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
20d10 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
20d20 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
20d30 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
20d40 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
20d50 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
20d60 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
20d70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
20d80 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
20d90 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
20da0 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
20db0 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
20dc0 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
20dd0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
20de0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
20df0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
20e00 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
20e10 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74  ILE, &<proxy_pat
20e20 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
20e30 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
20e40 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
20e50 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
20e60 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
20e70 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
20e80 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
20e90 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
20ea0 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
20eb0 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
20ec0 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
20ed0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
20ee0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
20ef0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
20f00 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
20f10 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
20f20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
20f30 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
20f40 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
20f50 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
20f60 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
20f70 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
20f80 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
20f90 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
20fa0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
20fb0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
20fc0 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
20fd0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
20fe0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
20ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21000 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
21010 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
21020 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
21030 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
21040 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
21050 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
21060 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
21070 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
21080 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
21090 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
210a0 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
210b0 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
210c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
210d0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
210e0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
210f0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
21100 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
21110 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
21120 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
21130 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
21140 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
21150 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
21160 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
21170 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
21180 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
21190 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
211a0 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
211b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
211c0 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
211d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
211e0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
211f0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
21200 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
21210 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
21220 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
21230 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21240 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
21250 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
21260 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
21270 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
21280 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
21290 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
212a0 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
212b0 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
212c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
212d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
212e0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
212f0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
21300 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
21310 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
21320 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
21330 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
21340 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
21350 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
21360 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
21370 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
21380 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
21390 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
213a0 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
213b0 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
213c0 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
213d0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
213e0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
213f0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
21400 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
21410 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
21420 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21430 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
21440 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
21450 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
21460 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
21470 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
21480 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
21490 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
214a0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
214b0 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f  it's contents do
214c0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
214d0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
214e0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
214f0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
21500 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
21510 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
21520 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
21530 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
21540 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
21550 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
21560 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
21570 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
21580 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
21590 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
215a0 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
215b0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
215c0 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
215d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
215e0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
215f0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
21600 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
21610 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
21620 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
21630 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
21640 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
21650 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
21660 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
21670 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
21680 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
21690 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
216a0 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
216b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
216c0 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
216d0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
216e0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
216f0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
21700 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
21710 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
21720 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
21730 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
21740 20 54 68 65 72 65 20 69 73 20 61 20 74 68 69 72   There is a thir
21750 64 20 66 69 6c 65 20 2d 20 74 68 65 20 68 6f 73  d file - the hos
21760 74 20 49 44 20 66 69 6c 65 20 2d 20 75 73 65 64  t ID file - used
21770 20 61 73 20 61 20 70 65 72 73 69 73 74 65 6e 74   as a persistent
21780 20 72 65 63 6f 72 64 0a 2a 2a 20 6f 66 20 61 20   record.** of a 
21790 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65  unique identifie
217a0 72 20 66 6f 72 20 74 68 65 20 68 6f 73 74 2c 20  r for the host, 
217b0 61 20 31 32 38 2d 62 79 74 65 20 75 6e 69 71 75  a 128-byte uniqu
217c0 65 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  e host id file.*
217d0 2a 20 69 6e 20 74 68 65 20 70 61 74 68 20 64 65  * in the path de
217e0 66 69 6e 65 64 20 62 79 20 74 68 65 20 48 4f 53  fined by the HOS
217f0 54 49 44 50 41 54 48 20 6d 61 63 72 6f 20 28 64  TIDPATH macro (d
21800 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 0a  efault value is.
21810 2a 2a 20 2f 4c 69 62 72 61 72 79 2f 43 61 63 68  ** /Library/Cach
21820 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71  es/.com.apple.sq
21830 6c 69 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 29  liteConchHostId)
21840 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
21850 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
21860 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
21870 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
21880 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
21890 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
218a0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
218b0 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
218c0 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
218d0 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
218e0 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
218f0 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
21900 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
21910 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
21920 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
21930 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
21940 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
21950 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
21960 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
21970 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
21980 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
21990 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
219a0 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
219b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
219c0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
219d0 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
219e0 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
219f0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
21a00 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
21a10 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
21a20 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
21a30 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
21a40 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
21a50 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
21a60 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
21a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a80 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
21a90 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
21aa0 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
21ab0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
21ac0 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
21ad0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
21ae0 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
21af0 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
21b00 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
21b10 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
21b20 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
21b30 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
21b40 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
21b50 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
21b60 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
21b70 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
21b80 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
21b90 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
21ba0 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
21bb0 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
21bc0 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
21bd0 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
21be0 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
21bf0 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
21c00 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
21c10 2a 2a 0a 2a 2a 20 20 48 4f 53 54 49 44 50 41 54  **.**  HOSTIDPAT
21c20 48 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  H.**.**       Ov
21c30 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
21c40 75 6c 74 20 68 6f 73 74 20 49 44 20 66 69 6c 65  ult host ID file
21c50 20 70 61 74 68 20 6c 6f 63 61 74 69 6f 6e 0a 2a   path location.*
21c60 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
21c70 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
21c80 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
21c90 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
21ca0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
21cb0 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
21cc0 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
21cd0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
21ce0 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
21cf0 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
21d00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
21d10 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
21d20 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
21d30 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
21d40 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
21d50 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
21d60 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
21d70 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
21d80 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
21d90 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
21da0 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
21db0 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
21dc0 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
21dd0 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
21de0 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
21df0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
21e00 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
21e10 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
21e20 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
21e30 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
21e40 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
21e50 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
21e60 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
21e70 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
21e80 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
21e90 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
21ea0 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
21eb0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
21ec0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
21ed0 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
21ee0 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
21ef0 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
21f00 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
21f10 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
21f20 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
21f30 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
21f40 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
21f50 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
21f60 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
21f70 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
21f80 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
21f90 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
21fa0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
21fb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
21fc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
21fd0 5f 53 54 59 4c 45 0a 0a 23 69 66 64 65 66 20 53  _STYLE..#ifdef S
21fe0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
21ff0 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
22000 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
22010 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
22020 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
22030 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
22040 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
22050 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
22060 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
22070 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
22080 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
22090 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
220a0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
220b0 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
220c0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
220d0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
220e0 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
220f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
22100 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
22110 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
22120 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
22130 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
22140 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
22150 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
22160 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
22170 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
22180 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
22190 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
221a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
221b0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
221c0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
221d0 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
221e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
221f0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
22200 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
22210 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
22220 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22230 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
22240 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22260 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
22270 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
22280 68 65 6c 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  held */.  void *
22290 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
222a0 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
222b0 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
222c0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
222d0 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
222e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
222f0 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
22300 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
22310 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
22320 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
22330 20 48 4f 53 54 49 44 4c 45 4e 20 61 6e 64 20 43   HOSTIDLEN and C
22340 4f 4e 43 48 4c 45 4e 20 62 6f 74 68 20 69 6e 63  ONCHLEN both inc
22350 6c 75 64 65 20 73 70 61 63 65 20 66 6f 72 20 74  lude space for t
22360 68 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20 74 65  he string .** te
22370 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 20 0a 2a  rminating nul .*
22380 2f 0a 23 64 65 66 69 6e 65 20 48 4f 53 54 49 44  /.#define HOSTID
22390 4c 45 4e 20 20 20 20 20 20 20 20 20 31 32 38 0a  LEN         128.
223a0 23 64 65 66 69 6e 65 20 43 4f 4e 43 48 4c 45 4e  #define CONCHLEN
223b0 20 20 20 20 20 20 20 20 20 20 28 4d 41 58 50 41            (MAXPA
223c0 54 48 4c 45 4e 2b 48 4f 53 54 49 44 4c 45 4e 2b  THLEN+HOSTIDLEN+
223d0 31 29 0a 23 69 66 6e 64 65 66 20 48 4f 53 54 49  1).#ifndef HOSTI
223e0 44 50 41 54 48 0a 23 20 64 65 66 69 6e 65 20 48  DPATH.# define H
223f0 4f 53 54 49 44 50 41 54 48 20 20 20 20 20 20 20  OSTIDPATH       
22400 22 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65 73  "/Library/Caches
22410 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c 69  /.com.apple.sqli
22420 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 22 0a 23  teConchHostId".#
22430 65 6e 64 69 66 0a 0a 2f 2a 20 62 61 73 69 63 61  endif../* basica
22440 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 75 6e  lly a copy of un
22450 69 78 52 61 6e 64 6f 6d 6e 65 73 73 20 77 69 74  ixRandomness wit
22460 68 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 74  h different.** t
22470 65 73 74 20 62 65 68 61 76 69 6f 72 20 62 75 69  est behavior bui
22480 6c 74 20 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20  lt in */.static 
22490 69 6e 74 20 70 72 6f 78 79 47 65 6e 65 72 61 74  int proxyGenerat
224a0 65 48 6f 73 74 49 44 28 63 68 61 72 20 2a 70 48  eHostID(char *pH
224b0 6f 73 74 49 44 29 7b 0a 20 20 69 6e 74 20 70 69  ostID){.  int pi
224c0 64 2c 20 66 64 2c 20 6c 65 6e 3b 0a 20 20 75 6e  d, fd, len;.  un
224d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
224e0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
224f0 72 20 2a 29 70 48 6f 73 74 49 44 3b 0a 20 20 0a  r *)pHostID;.  .
22500 20 20 6d 65 6d 73 65 74 28 6b 65 79 2c 20 30 2c    memset(key, 0,
22510 20 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 6c   HOSTIDLEN);.  l
22520 65 6e 20 3d 20 30 3b 0a 20 20 66 64 20 3d 20 6f  en = 0;.  fd = o
22530 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
22540 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  m", O_RDONLY);. 
22550 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
22560 20 20 6c 65 6e 20 3d 20 72 65 61 64 28 66 64 2c    len = read(fd,
22570 20 6b 65 79 2c 20 48 4f 53 54 49 44 4c 45 4e 29   key, HOSTIDLEN)
22580 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b  ;.    close(fd);
22590 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
225a0 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66  k the fd if it f
225b0 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ails */.  }.  if
225c0 28 20 6c 65 6e 20 3c 20 48 4f 53 54 49 44 4c 45  ( len < HOSTIDLE
225d0 4e 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f 74 20  N ){.    time_t 
225e0 74 3b 0a 20 20 20 20 74 69 6d 65 28 26 74 29 3b  t;.    time(&t);
225f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 6b 65 79 2c  .    memcpy(key,
22600 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
22610 0a 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69  .    pid = getpi
22620 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
22630 26 6b 65 79 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  &key[sizeof(t)],
22640 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
22650 64 29 29 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 64  d));.  }.  .#ifd
22660 65 66 20 4d 41 4b 45 5f 50 52 45 54 54 59 5f 48  ef MAKE_PRETTY_H
22670 4f 53 54 49 44 0a 20 20 7b 0a 20 20 20 20 69 6e  OSTID.  {.    in
22680 74 20 69 3b 0a 20 20 20 20 2f 2a 20 66 69 6c 74  t i;.    /* filt
22690 65 72 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  er the bytes int
226a0 6f 20 70 72 69 6e 74 61 62 6c 65 20 61 73 63 69  o printable asci
226b0 69 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64  i characters and
226c0 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 65 20 2a   NUL terminate *
226d0 2f 0a 20 20 20 20 6b 65 79 5b 28 48 4f 53 54 49  /.    key[(HOSTI
226e0 44 4c 45 4e 2d 31 29 5d 20 3d 20 30 78 30 30 3b  DLEN-1)] = 0x00;
226f0 0a 20 20 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  .    for( i=0; i
22700 3c 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 3b 20  <(HOSTIDLEN-1); 
22710 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 75 6e 73  i++ ){.      uns
22720 69 67 6e 65 64 20 63 68 61 72 20 70 61 20 3d 20  igned char pa = 
22730 6b 65 79 5b 69 5d 26 30 78 37 46 3b 0a 20 20 20  key[i]&0x7F;.   
22740 20 20 20 69 66 28 20 70 61 3c 30 78 32 30 20 29     if( pa<0x20 )
22750 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d  {.        key[i]
22760 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20   = (key[i]&0x80 
22770 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 2b 30 78  == 0x80) ? pa+0x
22780 34 30 20 3a 20 70 61 2b 30 78 32 30 3b 0a 20 20  40 : pa+0x20;.  
22790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61      }else if( pa
227a0 3d 3d 30 78 37 46 20 29 7b 0a 20 20 20 20 20 20  ==0x7F ){.      
227b0 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b    key[i] = (key[
227c0 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29  i]&0x80 == 0x80)
227d0 20 3f 20 70 61 3d 30 78 32 30 20 3a 20 70 61 2b   ? pa=0x20 : pa+
227e0 30 78 37 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0x7E;.      }.  
227f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
22800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22810 4b 3b 0a 7d 0a 0a 2f 2a 20 77 72 69 74 65 73 20  K;.}../* writes 
22820 74 68 65 20 68 6f 73 74 20 69 64 20 70 61 74 68  the host id path
22830 20 74 6f 20 70 61 74 68 2c 20 70 61 74 68 20 73   to path, path s
22840 68 6f 75 6c 64 20 62 65 20 61 6e 20 70 72 65 2d  hould be an pre-
22850 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
22860 0a 2a 2a 20 77 69 74 68 20 65 6e 6f 75 67 68 20  .** with enough 
22870 73 70 61 63 65 20 66 6f 72 20 61 20 70 61 74 68  space for a path
22880 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
22890 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 50   proxyGetHostIDP
228a0 61 74 68 28 63 68 61 72 20 2a 70 61 74 68 2c 20  ath(char *path, 
228b0 73 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20 20 73  size_t len){.  s
228c0 74 72 6c 63 70 79 28 70 61 74 68 2c 20 48 4f 53  trlcpy(path, HOS
228d0 54 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b 0a 23  TIDPATH, len);.#
228e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
228f0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
22900 68 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29 7b 0a  hostid_num>0 ){.
22910 20 20 20 20 63 68 61 72 20 73 75 66 66 69 78 5b      char suffix[
22920 32 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73 75  2] = "1";.    su
22930 66 66 69 78 5b 30 5d 20 3d 20 73 75 66 66 69 78  ffix[0] = suffix
22940 5b 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f 68 6f  [0] + sqlite3_ho
22950 73 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20 73 74  stid_num;.    st
22960 72 6c 63 61 74 28 70 61 74 68 2c 20 73 75 66 66  rlcat(path, suff
22970 69 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a 23 65  ix, len);.  }.#e
22980 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33 28  ndif.  OSTRACE3(
22990 22 47 45 54 48 4f 53 54 49 44 50 41 54 48 20 20  "GETHOSTIDPATH  
229a0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 61  %s pid=%d\n", pa
229b0 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 7d  th, getpid());.}
229c0 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
229d0 74 20 49 44 20 66 72 6f 6d 20 61 20 73 71 6c 69  t ID from a sqli
229e0 74 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 73  te hostid file s
229f0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a  tored in the .**
22a00 20 75 73 65 72 2d 73 70 65 63 69 66 69 63 20 74   user-specific t
22a10 6d 70 20 64 69 72 65 63 74 6f 72 79 2c 20 63 72  mp directory, cr
22a20 65 61 74 65 20 74 68 65 20 49 44 20 69 66 20 69  eate the ID if i
22a30 74 27 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c  t's not there al
22a40 72 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74 69 63  ready .*/.static
22a50 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
22a60 74 49 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49  tID(char *pHostI
22a70 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
22a80 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61  .  int fd;.  cha
22a90 72 20 70 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  r path[MAXPATHLE
22aa0 4e 5d 3b 20 0a 20 20 73 69 7a 65 5f 74 20 6c 65  N]; .  size_t le
22ab0 6e 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c 49  n;.  int rc=SQLI
22ac0 54 45 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 78 79 47  TE_OK;..  proxyG
22ad0 65 74 48 6f 73 74 49 44 50 61 74 68 28 70 61 74  etHostIDPath(pat
22ae0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
22af0 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61    /* try to crea
22b00 74 65 20 74 68 65 20 68 6f 73 74 20 49 44 20 66  te the host ID f
22b10 69 6c 65 2c 20 69 66 20 69 74 20 61 6c 72 65 61  ile, if it alrea
22b20 64 79 20 65 78 69 73 74 73 20 72 65 61 64 20 74  dy exists read t
22b30 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
22b40 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
22b50 20 4f 5f 43 52 45 41 54 7c 4f 5f 57 52 4f 4e 4c   O_CREAT|O_WRONL
22b60 59 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34 29 3b  Y|O_EXCL, 0644);
22b70 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
22b80 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
22b90 3b 0a 09 09 0a 20 20 20 20 69 66 28 20 65 72 72  ;....    if( err
22ba0 21 3d 45 45 58 49 53 54 20 29 7b 0a 23 69 66 64  !=EEXIST ){.#ifd
22bb0 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  ef SQLITE_PROXY_
22bc0 44 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65  DEBUG /* set the
22bd0 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65   sqlite error me
22be0 73 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f  ssage instead */
22bf0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
22c00 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65  tderr, "sqlite e
22c10 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 68 6f  rror creating ho
22c20 73 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25  st ID file %s: %
22c30 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
22c40 20 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72      path, strerr
22c50 6f 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66  or(err));.#endif
22c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22c70 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d  LITE_PERM;.    }
22c80 0a 20 20 20 20 2f 2a 20 63 6f 75 6c 64 6e 27 74  .    /* couldn't
22c90 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
22ca0 2c 20 72 65 61 64 20 69 74 20 69 6e 73 74 65 61  , read it instea
22cb0 64 20 2a 2f 0a 20 20 20 20 66 64 20 3d 20 6f 70  d */.    fd = op
22cc0 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c  en(path, O_RDONL
22cd0 59 7c 4f 5f 45 58 43 4c 29 3b 0a 20 20 20 20 69  Y|O_EXCL);.    i
22ce0 66 28 20 66 64 3c 30 20 29 7b 0a 23 69 66 64 65  f( fd<0 ){.#ifde
22cf0 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44  f SQLITE_PROXY_D
22d00 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20  EBUG /* set the 
22d10 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73  sqlite error mes
22d20 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a  sage instead */.
22d30 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
22d40 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 66 70 72  errno;.      fpr
22d50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
22d60 6c 69 74 65 20 65 72 72 6f 72 20 6f 70 65 6e 69  lite error openi
22d70 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  ng host ID file 
22d80 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s: %s\n",.     
22d90 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 73           path, s
22da0 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 23  trerror(err));.#
22db0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
22dc0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
22dd0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
22de0 70 72 65 61 64 28 66 64 2c 20 70 48 6f 73 74 49  pread(fd, pHostI
22df0 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29  D, HOSTIDLEN, 0)
22e00 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20  ;.    if( len<0 
22e10 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
22e20 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
22e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22e40 52 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73  R_READ;.    }els
22e50 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44  e if( len<HOSTID
22e60 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  LEN ){.      *pE
22e70 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rror = 0;.      
22e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22e90 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
22ea0 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64    }.    close(fd
22eb0 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
22ec0 65 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74  eak the fd if it
22ed0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53   fails */.    OS
22ee0 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49  TRACE3("GETHOSTI
22ef0 44 20 20 72 65 61 64 20 25 73 20 70 69 64 3d 25  D  read %s pid=%
22f00 64 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67  d\n", pHostID, g
22f10 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65  etpid());.    re
22f20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65  turn rc;.  }else
22f30 7b 0a 20 20 20 20 2f 2a 20 77 65 27 72 65 20 63  {.    /* we're c
22f40 72 65 61 74 69 6e 67 20 74 68 65 20 68 6f 73 74  reating the host
22f50 20 49 44 20 66 69 6c 65 20 28 75 73 65 20 61 20   ID file (use a 
22f60 72 61 6e 64 6f 6d 20 73 74 72 69 6e 67 20 6f 66  random string of
22f70 20 62 79 74 65 73 29 20 2a 2f 0a 20 20 20 20 70   bytes) */.    p
22f80 72 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74  roxyGenerateHost
22f90 49 44 28 70 48 6f 73 74 49 44 29 3b 0a 20 20 20  ID(pHostID);.   
22fa0 20 6c 65 6e 20 3d 20 70 77 72 69 74 65 28 66 64   len = pwrite(fd
22fb0 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49  , pHostID, HOSTI
22fc0 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  DLEN, 0);.    if
22fd0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
22fe0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f   *pError = errno
22ff0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
23000 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
23010 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
23020 65 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a  en<HOSTIDLEN ){.
23030 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
23040 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  0;.      rc = SQ
23050 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
23060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  ;.    }.    clos
23070 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
23080 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69  ly leak the fd i
23090 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20  f it fails */.  
230a0 20 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48    OSTRACE3("GETH
230b0 4f 53 54 49 44 20 20 77 72 6f 74 65 20 25 73 20  OSTID  wrote %s 
230c0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f 73 74  pid=%d\n", pHost
230d0 49 44 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  ID, getpid());. 
230e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
230f0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
23100 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
23110 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
23120 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
23130 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
23140 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
23150 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
23160 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
23170 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
23180 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
23190 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
231a0 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
231b0 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
231c0 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
231d0 0a 20 20 20 20 63 6f 6e 66 73 74 72 28 5f 43 53  .    confstr(_CS
231e0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
231f0 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
23200 78 4c 65 6e 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  xLen);.    len =
23210 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
23220 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
23230 6d 61 78 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28  maxLen);.    if(
23240 20 6d 6b 64 69 72 28 6c 50 61 74 68 2c 20 53 51   mkdir(lPath, SQ
23250 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
23260 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
23270 53 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  S) ){.      /* i
23280 66 20 6d 6b 64 69 72 20 66 61 69 6c 73 2c 20 68  f mkdir fails, h
23290 61 6e 64 6c 65 20 61 73 20 6c 6f 63 6b 20 66 69  andle as lock fi
232a0 6c 65 20 63 72 65 61 74 69 6f 6e 20 66 61 69 6c  le creation fail
232b0 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ure */.      int
232c0 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 23 20   err = errno;.# 
232d0 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
232e0 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 65 72  BUG.      if( er
232f0 72 21 3d 45 45 58 49 53 54 20 29 7b 0a 20 20 20  r!=EEXIST ){.   
23300 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
23310 65 72 72 2c 20 22 70 72 6f 78 79 47 65 74 4c 6f  err, "proxyGetLo
23320 63 6b 50 61 74 68 3a 20 6d 6b 64 69 72 28 25 73  ckPath: mkdir(%s
23330 2c 30 25 6f 29 20 65 72 72 6f 72 20 25 64 20 25  ,0%o) error %d %
23340 73 5c 6e 22 2c 20 6c 50 61 74 68 2c 0a 20 20 20  s\n", lPath,.   
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
23360 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
23370 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
23380 2c 20 65 72 72 2c 20 73 74 72 65 72 72 6f 72 28  , err, strerror(
23390 65 72 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  err));.      }.#
233a0 20 20 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73    endif.    }els
233b0 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e{.      OSTRACE
233c0 33 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  3("GETLOCKPATH  
233d0 6d 6b 64 69 72 20 25 73 20 70 69 64 3d 25 64 5c  mkdir %s pid=%d\
233e0 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
233f0 64 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  d());.    }.    
23400 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
23410 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
23420 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
23430 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
23440 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
23450 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
23460 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
23470 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
23480 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
23490 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
234a0 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
234b0 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
234c0 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
234d0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
234e0 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
234f0 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
23500 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  7)<maxLen; i++){
23510 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
23520 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
23530 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
23540 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
23550 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
23560 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
23570 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
23580 6d 61 78 4c 65 6e 29 3b 0a 20 20 72 65 74 75 72  maxLen);.  retur
23590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
235a0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
235b0 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63  ew VFS file desc
235c0 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69  riptor (stored i
235d0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
235e0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
235f0 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70  3_malloc) and op
23600 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  en the file name
23610 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20  d "path" in the 
23620 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
23630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
23640 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
23650 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c   not only for cl
23660 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  osing the file d
23670 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74  escriptor.** but
23680 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e   also for freein
23690 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73  g the memory ass
236a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
236b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
236c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
236d0 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
236e0 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
236f0 70 61 74 68 2c 20 75 6e 69 78 46 69 6c 65 20 2a  path, unixFile *
23700 2a 70 70 46 69 6c 65 29 20 7b 0a 20 20 69 6e 74  *ppFile) {.  int
23710 20 66 64 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   fd;.  int dirfd
23720 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
23730 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
23740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23750 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
23760 6d 79 56 66 73 3b 0a 0a 20 20 66 64 20 3d 20 6f  myVfs;..  fd = o
23770 70 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 57 52  pen(path, O_RDWR
23780 20 7c 20 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49   | O_CREAT, SQLI
23790 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
237a0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
237b0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
237c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
237d0 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 0a 20  NTOPEN;.  }.  . 
237e0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
237f0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
23800 6f 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  oc(sizeof(unixFi
23810 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  le));.  if( pNew
23820 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
23830 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23840 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
23850 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
23860 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
23870 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
23880 65 29 29 3b 0a 0a 20 20 64 75 6d 6d 79 56 66 73  e));..  dummyVfs
23890 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
238a0 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
238b0 6e 64 65 72 3b 0a 20 20 72 63 20 3d 20 66 69 6c  nder;.  rc = fil
238c0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
238d0 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  myVfs, fd, dirfd
238e0 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
238f0 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20  )pNew, path, 0, 
23900 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
23910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
23920 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
23930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23940 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
23950 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
23960 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73   close(fd); /* s
23970 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20  ilently leak fd 
23980 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20  if error, we're 
23990 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
239a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
239b0 65 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ee(pNew);.  retu
239c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 74 61 6b  rn rc;.}../* tak
239d0 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20  es the conch by 
239e0 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20  taking a shared 
239f0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68  lock and read th
23a00 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68  e contents conch
23a10 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  , if .** lockPat
23a20 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  h is non-NULL, t
23a30 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c  he host ID and l
23a40 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75  ock file path mu
23a50 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c  st match.  A NUL
23a60 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d  L .** lockPath m
23a70 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f  eans that the lo
23a80 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f  ckPath in the co
23a90 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
23aa0 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a   used if the .**
23ab0 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c   host IDs match,
23ac0 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70   or a new lock p
23ad0 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ath will be gene
23ae0 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  rated automatica
23af0 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74  lly .** and writ
23b00 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68  ten to the conch
23b10 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
23b20 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f   int proxyTakeCo
23b30 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
23b40 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ile){.  proxyLoc
23b50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
23b60 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
23b70 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
23b80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
23b90 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78  ; .  .  if( pCtx
23ba0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
23bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23bc0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
23bd0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
23be0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
23bf0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 63  conchFile;.    c
23c00 68 61 72 20 74 65 73 74 56 61 6c 75 65 5b 43 4f  har testValue[CO
23c10 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
23c20 72 20 63 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e  r conchValue[CON
23c30 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
23c40 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
23c50 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
23c60 2a 74 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  *tLockPath = NUL
23c70 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
23c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
23c90 6e 74 20 72 65 61 64 52 63 20 3d 20 53 51 4c 49  nt readRc = SQLI
23ca0 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73  TE_OK;.    int s
23cb0 79 6e 63 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20  yncPerms = 0;.. 
23cc0 20 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b     OSTRACE4("TAK
23cd0 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
23ce0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
23cf0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
23d00 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
23d10 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
23d20 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
23d30 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
23d40 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20  getpid());..    
23d50 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
23d60 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
23d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
23d80 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
23d90 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
23da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23db0 20 20 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72        int pError
23dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
23dd0 65 74 28 74 65 73 74 56 61 6c 75 65 2c 20 30 2c  et(testValue, 0,
23de0 20 43 4f 4e 43 48 4c 45 4e 29 3b 20 2f 2a 20 63   CONCHLEN); /* c
23df0 6f 6e 63 68 20 69 73 20 66 69 78 65 64 20 73 69  onch is fixed si
23e00 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ze */.      rc =
23e10 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
23e20 74 65 73 74 56 61 6c 75 65 2c 20 26 70 45 72 72  testValue, &pErr
23e30 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  or);.      if( (
23e40 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
23e50 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
23e60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
23e70 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
23e80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23e90 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
23ea0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  th ){.        st
23eb0 72 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65  rlcpy(&testValue
23ec0 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74  [HOSTIDLEN], pCt
23ed0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
23ee0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
23ef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23f10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
23f20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
23f30 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72      }.    .    r
23f40 65 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64  eadRc = unixRead
23f50 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
23f60 29 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63  )conchFile, conc
23f70 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e  hValue, CONCHLEN
23f80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
23f90 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  adRc!=SQLITE_IOE
23fa0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
23fb0 0a 20 20 20 20 20 20 69 66 28 20 72 65 61 64 52  .      if( readR
23fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23fd0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63 26          if( (rc&
23fe0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
23ff0 45 52 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERR ){.         
24000 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
24010 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
24020 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
24030 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
24040 20 72 65 61 64 52 63 3b 0a 20 20 20 20 20 20 20   readRc;.       
24050 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
24060 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
24070 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
24080 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
24090 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
240a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
240b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
240c0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  th ){.        /*
240d0 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
240e0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
240f0 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
24100 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
24110 6c 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  l.         ** us
24120 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
24130 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
24140 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
24150 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  re */.        if
24160 28 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61  ( !memcmp(testVa
24170 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c  lue, conchValue,
24180 20 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20   HOSTIDLEN) ){. 
24190 20 20 20 20 20 20 20 20 20 74 4c 6f 63 6b 50 61           tLockPa
241a0 74 68 20 3d 20 28 63 68 61 72 20 2a 29 26 63 6f  th = (char *)&co
241b0 6e 63 68 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c  nchValue[HOSTIDL
241c0 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  EN];.          g
241d0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
241e0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
241f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24200 20 20 2f 2a 20 77 65 27 76 65 20 67 6f 74 20 74    /* we've got t
24210 68 65 20 63 6f 6e 63 68 20 69 66 20 63 6f 6e 63  he conch if conc
24220 68 56 61 6c 75 65 20 6d 61 74 63 68 65 73 20 6f  hValue matches o
24230 75 72 20 70 61 74 68 20 61 6e 64 20 68 6f 73 74  ur path and host
24240 20 49 44 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   ID */.        i
24250 66 28 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56  f( !memcmp(testV
24260 61 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65  alue, conchValue
24270 2c 20 43 4f 4e 43 48 4c 45 4e 29 20 29 7b 0a 20  , CONCHLEN) ){. 
24280 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24290 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
242a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
242b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
242c0 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
242d0 6d 65 61 6e 73 20 77 65 27 72 65 20 22 63 72 65  means we're "cre
242e0 61 74 69 6e 67 22 20 74 68 65 20 63 6f 6e 63 68  ating" the conch
242f0 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74   (even though it
24300 20 63 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a   could .      **
24310 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 72 2d   have been user-
24320 69 6e 74 65 72 76 65 6e 74 69 6f 6e 29 2c 20 69  intervention), i
24330 66 20 77 65 20 61 63 71 75 69 72 65 20 74 68 65  f we acquire the
24340 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
24350 0a 20 20 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20  .      ** we'll 
24360 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
24370 20 63 75 72 72 65 6e 74 20 6f 6e 2d 64 69 73 6b   current on-disk
24380 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
24390 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
243a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 79 6e 63     */.      sync
243b0 50 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 7d  Perms = 1;.    }
243c0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 65 69 74  .    .    /* eit
243d0 68 65 72 20 63 6f 6e 63 68 20 77 61 73 20 65 6d  her conch was em
243e0 74 70 79 20 6f 72 20 64 69 64 6e 27 74 20 6d 61  tpy or didn't ma
243f0 74 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  tch */.    if( !
24400 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
24410 61 74 68 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ath ){.      pro
24420 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43  xyGetLockPath(pC
24430 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b  tx->dbPath, lock
24440 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
24450 29 3b 0a 20 20 20 20 20 20 74 4c 6f 63 6b 50 61  );.      tLockPa
24460 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
24470 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65       strlcpy(&te
24480 73 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45  stValue[HOSTIDLE
24490 4e 5d 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  N], lockPath, MA
244a0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 7d  XPATHLEN);.    }
244b0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 75 70 64  .    .    /* upd
244c0 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
244d0 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
244e0 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
244f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
24500 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72     ** has a shar
24510 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29  ed lock already)
24520 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e   */.    rc = con
24530 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
24540 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
24550 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
24560 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
24570 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
24580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24590 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28   rc = unixWrite(
245a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
245b0 63 6f 6e 63 68 46 69 6c 65 2c 20 74 65 73 74 56  conchFile, testV
245c0 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20  alue, CONCHLEN, 
245d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
245e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
245f0 79 6e 63 50 65 72 6d 73 20 29 7b 0a 20 20 20 20  yncPerms ){.    
24600 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
24610 62 75 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  buf;.        int
24620 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69   err = fstat(pFi
24630 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
24640 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30        if( err==0
24650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
24660 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
24670 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24680 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e  permissions, ign
24690 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23  ore failure */.#
246a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52  ifndef SQLITE_PR
246b0 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20  OXY_DEBUG.      
246c0 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68      fchmod(conch
246d0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
246e0 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  mode);.#else.   
246f0 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f         if( fchmo
24700 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
24710 62 75 66 2e 73 74 5f 6d 6f 64 65 29 21 3d 30 20  buf.st_mode)!=0 
24720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
24730 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
24740 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
24750 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
24760 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77  hmod %o FAILED w
24770 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ith %d %s\n",.  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2e 73             buf.s
247a0 74 5f 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74  t_mode, code, st
247b0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
247c0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
247d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
247e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
247f0 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45  chmod %o SUCCEDE
24800 44 5c 6e 22 2c 62 75 66 2e 73 74 5f 6d 6f 64 65  D\n",buf.st_mode
24810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24830 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
24840 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
24850 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
24860 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44  rr, "STAT FAILED
24870 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c  [%d] with %d %s\
24880 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
248a0 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
248b0 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
248c0 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
248d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f    }.    }.    co
248e0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
248f0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
24900 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
24910 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
24920 3b 0a 20 20 0a 65 6e 64 5f 74 61 6b 65 63 6f 6e  ;.  .end_takecon
24930 63 68 3a 0a 20 20 20 20 4f 53 54 52 41 43 45 32  ch:.    OSTRACE2
24940 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c  ("TRANSPROXY: CL
24950 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c  OSE  %d\n", pFil
24960 65 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20 72  e->h);.    if( r
24970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24980 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
24990 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
249a0 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66  ile->h>=0 ){.#if
249b0 64 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45  def STRICT_CLOSE
249c0 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 69  _ERROR.        i
249d0 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  f( close(pFile->
249e0 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
249f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
24a00 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
24a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24a20 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20  E_IOERR_CLOSE;. 
24a30 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
24a40 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69         close(pFi
24a50 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e  le->h); /* silen
24a60 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66  tly leak fd if f
24a70 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ail */.#endif.  
24a80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 46 69 6c      }.      pFil
24a90 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
24aa0 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70   int fd = open(p
24ab0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  Ctx->dbPath, pFi
24ac0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20  le->openFlags,. 
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
24af0 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
24b00 4e 53 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  NS);.      OSTRA
24b10 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE2("TRANSPROXY:
24b20 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64   OPEN  %d\n", fd
24b30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64 3e  );.      if( fd>
24b40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
24b50 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20  ile->h = fd;.   
24b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24b70 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
24b80 4f 50 45 4e 3b 20 2f 2a 20 53 51 4c 49 54 45 5f  OPEN; /* SQLITE_
24b90 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43  BUSY? proxyTakeC
24ba0 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20  onch called.    
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e             durin
24bd0 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  g locking */.   
24be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
24bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24c00 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50   && !pCtx->lockP
24c10 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 63 68  roxy ){.      ch
24c20 61 72 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63 6b  ar *path = tLock
24c30 50 61 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74 68  Path ? tLockPath
24c40 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   : pCtx->lockPro
24c50 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 2f 2a  xyPath;.      /*
24c60 20 41 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d 61   ACS: Need to ma
24c70 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74  ke a copy of pat
24c80 68 20 73 6f 6d 65 74 69 6d 65 73 20 2a 2f 0a 20  h sometimes */. 
24c90 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43       rc = proxyC
24ca0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61  reateUnixFile(pa
24cb0 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50  th, &pCtx->lockP
24cc0 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
24cd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24ce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 74 78  OK ){.      pCtx
24cf0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b  ->conchHeld = 1;
24d00 0a 0a 20 20 20 20 20 20 69 66 28 20 74 4c 6f 63  ..      if( tLoc
24d10 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
24d20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
24d30 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
24d40 53 74 72 44 75 70 28 30 2c 20 74 4c 6f 63 6b 50  StrDup(0, tLockP
24d50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
24d60 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
24d70 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  y->pMethod == &a
24d80 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
24d90 20 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f           ((afpLo
24da0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
24db0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
24dc0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
24dd0 3e 64 62 50 61 74 68 20 3d 0a 20 20 20 20 20 20  >dbPath =.      
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24df0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
24e00 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  th;.        }.  
24e10 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
24e20 20 7b 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   {.      conchFi
24e30 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
24e40 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
24e50 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
24e60 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  O_LOCK);.    }. 
24e70 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b     OSTRACE3("TAK
24e80 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
24e90 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
24ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
24eb0 6b 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20  k":"failed");.  
24ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69  .}../*.** If pFi
24ee0 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  le holds a lock 
24ef0 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c  on a conch file,
24f00 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68   then release th
24f10 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  at lock..*/.stat
24f20 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65  ic int proxyRele
24f30 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  aseConch(unixFil
24f40 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
24f50 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24f60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
24f70 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f  outine return co
24f80 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  de */.  proxyLoc
24f90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
24fa0 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69  x;  /* The locki
24fb0 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74  ng context for t
24fc0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f  he proxy lock */
24fd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
24fe0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  chFile;        /
24ff0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
25000 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  nch file */..  p
25010 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
25020 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
25030 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
25040 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20  xt;.  conchFile 
25050 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
25060 65 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52  e;.  OSTRACE4("R
25070 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
25080 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
25090 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
250a0 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
250b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
250c0 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
250d0 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
250e0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67  ), .           g
250f0 65 74 70 69 64 28 29 29 3b 0a 20 20 70 43 74 78  etpid());.  pCtx
25100 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
25110 0a 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c  .  rc = conchFil
25120 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
25130 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
25140 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
25150 5f 4c 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41 43  _LOCK);.  OSTRAC
25160 45 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E3("RELEASECONCH
25170 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
25180 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
25190 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
251a0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
251b0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
251c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
251d0 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
251e0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
251f0 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61  , compute the na
25200 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20  me of its conch 
25210 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  file..** Store t
25220 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
25230 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  e in memory obta
25240 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
25250 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d  3_malloc()..** M
25260 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  ake *pConchPath 
25270 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
25280 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53   name.  Return S
25290 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
252a0 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ess.** or SQLITE
252b0 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65  _NOMEM if unable
252c0 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72   to obtain memor
252d0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
252e0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
252f0 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
25300 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
25310 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  ed memory.** spa
25320 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ce is eventually
25330 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70   freed..**.** *p
25340 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74  ConchPath is set
25350 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65   to NULL if a me
25360 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
25370 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
25380 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
25390 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
253a0 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74  name(char *dbPat
253b0 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68  h, char **pConch
253c0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Path){.  int i; 
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
253f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
25400 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
25410 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65  n(dbPath); /* Le
25420 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65  ngth of database
25430 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61   filename - dbPa
25440 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  th */.  char *co
25450 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20  nchPath;        
25460 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20        /* buffer 
25470 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  in which to cons
25480 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65  truct conch name
25490 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
254a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
254b0 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
254c0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
254d0 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20  he name to.  ** 
254e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
254f0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
25500 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a  e file. */  .  *
25510 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e  pConchPath = con
25520 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  chPath = (char *
25530 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
25540 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20  len + 8);.  if( 
25550 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a  conchPath==0 ){.
25560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25570 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
25580 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c  emcpy(conchPath,
25590 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b   dbPath, len+1);
255a0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73  .  .  /* now ins
255b0 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65  ert a "." before
255c0 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72   the last / char
255d0 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20  acter */.  for( 
255e0 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b  i=(len-1); i>=0;
255f0 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   i-- ){.    if( 
25600 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f  conchPath[i]=='/
25610 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
25620 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25630 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61   }.  }.  conchPa
25640 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69  th[i]='.';.  whi
25650 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20  le ( i<len ){.  
25660 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d    conchPath[i+1]
25670 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20  =dbPath[i];.    
25680 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  i++;.  }..  /* a
25690 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63  ppend the "-conc
256a0 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65  h" suffix to the
256b0 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70   file */.  memcp
256c0 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31  y(&conchPath[i+1
256d0 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b  ], "-conch", 7);
256e0 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29  .  assert( (int)
256f0 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68  strlen(conchPath
25700 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20  ) == len+7 );.. 
25710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25720 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20  K;.}.../* Takes 
25730 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
25740 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
25750 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
25760 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
25770 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
25780 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
25790 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
257a0 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
257b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
257c0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
257d0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
257e0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
257f0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
25800 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
25810 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
25820 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
25830 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
25840 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  th;.  int rc = S
25850 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
25860 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
25870 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
25880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
25890 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
258a0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
258b0 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
258c0 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
258d0 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
258e0 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
258f0 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
25900 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
25910 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
25920 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
25930 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
25940 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
25950 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
25960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25970 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
25980 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
25990 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
259a0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
259b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
259c0 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
259d0 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
259e0 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
259f0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
25a00 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
25a10 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
25a20 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
25a30 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
25a40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25a60 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
25a70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25a80 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
25a90 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
25aa0 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
25ab0 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
25ac0 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
25ad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25ae0 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
25af0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
25b00 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
25b10 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
25b20 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
25b30 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
25b40 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
25b50 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
25b60 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
25b70 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
25b80 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
25b90 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
25ba0 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
25bb0 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
25bc0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
25bd0 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
25be0 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
25bf0 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
25c00 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
25c10 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66  (__APPLE__).  if
25c20 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
25c30 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
25c40 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
25c50 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
25c60 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
25c70 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
25c80 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
25c90 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
25ca0 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
25cb0 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
25cc0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
25cd0 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
25ce0 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
25cf0 74 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 28  trcpy(dbPath, ((
25d00 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
25d10 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
25d20 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
25d30 74 68 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  th);.  }else.#en
25d40 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
25d50 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
25d60 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
25d70 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
25d80 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
25d90 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
25da0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
25db0 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
25dc0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
25dd0 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
25de0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
25df0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
25e00 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
25e10 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
25e20 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
25e30 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
25e40 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
25e50 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
25e60 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
25e70 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
25e80 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
25e90 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
25ea0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
25eb0 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
25ec0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
25ed0 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
25ee0 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
25ef0 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  rcpy(dbPath, (ch
25f00 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
25f10 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
25f20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25f30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
25f40 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66  kes an already f
25f50 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69  illed in unix fi
25f60 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74  le and alters it
25f70 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63   so all file loc
25f80 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65  king .** will be
25f90 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
25fa0 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f  e local proxy lo
25fb0 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f  ck file.  The fo
25fc0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a  llowing fields.*
25fd0 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  * are preserved 
25fe0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
25ff0 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74  ontext so that t
26000 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
26010 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  red and .** the 
26020 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70  unix structure p
26030 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20  roperly cleaned 
26040 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65  up at close time
26050 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43  :.**  ->lockingC
26060 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65  ontext.**  ->pMe
26070 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  thod.*/.static i
26080 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
26090 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
260a0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
260b0 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
260c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
260d0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68  text *pCtx;.  ch
260e0 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54  ar dbPath[MAXPAT
260f0 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f  HLEN+1];       /
26100 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
26110 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
26120 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d   char *lockPath=
26130 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
26140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
26150 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
26160 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
26170 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26180 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
26190 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
261a0 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
261b0 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
261c0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
261d0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
261e0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
261f0 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
26200 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
26210 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
26220 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
26230 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 52   .  OSTRACE4("TR
26240 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
26250 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
26260 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
26270 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
26280 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
26290 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
262a0 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
262b0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
262c0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
262d0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
262e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
262f0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
26300 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
26310 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
26320 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
26330 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
26340 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
26350 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
26360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26370 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
26380 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
26390 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
263a0 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
263b0 68 46 69 6c 65 29 3b 0a 20 20 7d 20 20 0a 20 20  hFile);.  }  .  
263c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
263d0 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b  K && lockPath ){
263e0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
263f0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
26400 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f  e3DbStrDup(0, lo
26410 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  ckPath);.  }..  
26420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26430 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  K ){.    /* all 
26440 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
26450 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20  ted, proxys are 
26460 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69  created and assi
26470 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77  gned, .    ** sw
26480 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67  itch the locking
26490 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
264a0 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e  thod then return
264b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74  ..    */.    pCt
264c0 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69  x->dbPath = sqli
264d0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64  te3DbStrDup(0, d
264e0 62 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  bPath);.    pCtx
264f0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
26500 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
26510 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
26520 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
26530 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
26540 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
26550 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
26560 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
26570 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
26580 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
26590 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
265a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
265b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
265c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
265d0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
265e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
265f0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
26600 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
26610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
26620 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
26630 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
26640 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
26650 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
26660 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20  FilePath); .    
26670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
26680 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  x);.  }.  OSTRAC
26690 45 33 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E3("TRANSPROXY  
266a0 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
266b0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
266c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
266d0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
266e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
266f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
26700 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73  outine handles s
26710 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
26720 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74  rol() calls that
26730 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   are specific.**
26740 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   to proxy lockin
26750 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
26760 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
26770 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
26780 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
26790 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
267a0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
267b0 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
267c0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
267d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
267e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
267f0 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  )id;.      if( p
26800 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
26810 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
26820 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
26830 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26840 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
26850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
26860 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
26870 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ext;.        pro
26880 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
26890 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
268a0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
268b0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
268c0 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
268d0 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f  )pArg = pCtx->lo
268e0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
268f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26900 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
26910 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61  ar **)pArg = ":a
26920 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22  uto: (not held)"
26930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26940 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
26950 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
26960 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a  **)pArg = NULL;.
26970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
26980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26990 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
269a0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
269b0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
269c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
269d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
269e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
269f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26a00 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79    int isProxySty
26a10 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65  le = (pFile->pMe
26a20 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
26a30 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20  Methods);.      
26a40 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
26a50 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
26a60 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
26a70 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
26a80 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
26a90 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
26aa0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
26ab0 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
26ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26ad0 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49  ITE_ERROR /*SQLI
26ae0 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c  TE_PROTOCOL? SQL
26af0 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20  ITE_MISUSE?*/;. 
26b00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26b10 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
26b20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
26b30 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20  g - already off 
26b40 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20  - NOOP */.      
26b50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26b60 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
26b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
26b90 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73  roxyPath = (cons
26ba0 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20  t char *)pArg;. 
26bb0 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
26bc0 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
26bd0 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
26be0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
26bf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
26c00 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
26c10 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
26c20 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
26c30 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70       if( !strcmp
26c40 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29  (pArg, ":auto:")
26c50 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
26c60 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
26c70 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20  Path &&.        
26c80 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28         !strncmp(
26c90 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
26ca0 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  ath, proxyPath, 
26cb0 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20  MAXPATHLEN)).   
26cc0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26cd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26ce0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
26cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26d00 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f     rc = switchLo
26d10 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c  ckProxyPath(pFil
26d20 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
26d30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26d50 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70      /* turn on p
26d60 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
26d70 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  g */.          r
26d80 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
26d90 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  rmUnixFile(pFile
26da0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
26db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26dd0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
26de0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
26df0 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65  rt( 0 );  /* The
26e00 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68   call assures th
26e10 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70  at only valid op
26e20 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a  codes are sent *
26e30 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  /.    }.  }.  /*
26e40 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72  NOTREACHED*/.  r
26e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
26e60 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74  OR;.}../*.** Wit
26e70 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f  hin this divisio
26e80 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20  n (the proxying 
26e90 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
26ea0 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63  tation) the proc
26eb0 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20  edures.** above 
26ec0 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61  this point are a
26ed0 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54  ll utilities.  T
26ee0 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20  he lock-related 
26ef0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a  methods of the.*
26f00 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  * proxy-locking 
26f10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
26f20 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e  d object follow.
26f30 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .*/.../*.** This
26f40 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
26f50 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
26f60 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
26f70 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
26f80 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
26f90 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
26fa0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
26fb0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
26fc0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
26fd0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
26fe0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
26ff0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
27000 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
27010 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
27020 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
27030 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
27040 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
27050 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
27060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
27070 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
27080 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
27090 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
270a0 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69  sOut) {.  unixFi
270b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
270c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
270d0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
270e0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
270f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27100 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
27110 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
27120 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
27130 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
27140 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
27150 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
27160 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
27170 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 65 74  ckProxy;.    ret
27180 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  urn proxy->pMeth
27190 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  od->xCheckReserv
271a0 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  edLock((sqlite3_
271b0 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65  file*)proxy, pRe
271c0 73 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  sOut);.  }.  ret
271d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
271e0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
271f0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
27200 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
27210 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
27220 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
27230 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
27240 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
27250 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
27260 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
27270 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
27280 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
27290 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
272a0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
272b0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
272c0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
272d0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
272e0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
272f0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
27300 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
27310 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
27320 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
27330 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
27340 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
27350 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
27360 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
27370 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
27380 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
27390 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
273a0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
273b0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
273c0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
273d0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
273e0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
273f0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
27400 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
27410 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
27420 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
27430 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
27440 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
27450 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
27460 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
27470 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
27480 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
27490 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
274a0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
274b0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
274c0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
274d0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
274e0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
274f0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
27500 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
27510 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
27520 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
27530 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
27540 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
27550 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
27560 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
27570 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
27580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27590 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
275a0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
275b0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
275c0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
275d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
275e0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
275f0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
27600 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  roxy;.    rc = p
27610 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
27620 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
27630 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74  le*)proxy, lockt
27640 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ype);.    pFile-
27650 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78  >locktype = prox
27660 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d  y->locktype;.  }
27670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27680 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
27690 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
276a0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
276b0 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
276c0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
276d0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
276e0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
276f0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
27700 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
27710 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
27720 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
27730 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
27740 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
27750 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
27760 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
27770 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
27780 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
27790 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
277a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
277b0 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
277c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
277d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
277e0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
277f0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
27800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27810 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
27820 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
27830 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
27840 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
27850 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
27860 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
27870 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
27880 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20  ckProxy;.    rc 
27890 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
278a0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
278b0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
278c0 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70  locktype);.    p
278d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
278e0 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65   proxy->locktype
278f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
27910 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73  e a file that us
27920 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a  es proxy locks..
27930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
27940 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
27950 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
27960 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
27970 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
27980 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
27990 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
279a0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
279b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
279c0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
279d0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
279e0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
279f0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
27a00 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46  Proxy;.    unixF
27a10 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
27a20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
27a30 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
27a40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20  QLITE_OK;.    . 
27a50 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79     if( lockProxy
27a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
27a70 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
27a80 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
27a90 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72  te3_file*)lockPr
27aa0 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  oxy, NO_LOCK);. 
27ab0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27ac0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
27ad0 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
27ae0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
27af0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
27b00 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
27b10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
27b20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
27b30 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79  3_free(lockProxy
27b40 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  );.      pCtx->l
27b50 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20  ockProxy = 0;.  
27b60 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63    }.    if( conc
27b70 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  hFile ){.      i
27b80 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
27b90 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ld ){.        rc
27ba0 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43   = proxyReleaseC
27bb0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
27bc0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27bd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
27be0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  .      rc = conc
27bf0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
27c00 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
27c10 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29  file*)conchFile)
27c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
27c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27c40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
27c50 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
27c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27c70 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  e(pCtx->lockProx
27c80 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  yPath);.    sqli
27c90 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
27ca0 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20  onchFilePath);. 
27cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27cc0 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20  pCtx->dbPath);. 
27cd0 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68     /* restore th
27ce0 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  e original locki
27cf0 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
27d00 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73  Method then clos
27d10 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c  e it */.    pFil
27d20 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
27d30 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63  t = pCtx->oldLoc
27d40 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
27d50 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
27d60 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68  = pCtx->pOldMeth
27d70 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  od;.    sqlite3_
27d80 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20  free(pCtx);.    
27d90 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d  return pFile->pM
27da0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64  ethod->xClose(id
27db0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
27dd0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
27de0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
27df0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
27e00 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
27e10 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
27e20 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20  ocking style is 
27e30 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65  intended for use
27e40 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73 79   with AFP filesy
27e50 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69  stems..** And si
27e60 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20  nce AFP is only 
27e70 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63  supported on Mac
27e80 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c  OSX, the proxy l
27e90 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a  ocking is also.*
27ea0 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20  * restricted to 
27eb0 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a  MacOSX..** .**.*
27ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ed0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72  ** End of the pr
27ee0 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  oxy lock impleme
27ef0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a  ****************
27f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
27f60 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
27f70 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
27f80 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
27f90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27fa0 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6c  ine registers al
27fb0 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  l VFS implementa
27fc0 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c  tions for unix-l
27fd0 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a  ike operating.**
27fe0 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20   systems.  This 
27ff0 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65  routine, and the
28000 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
28010 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66  ) routine that f
28020 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c  ollows,.** shoul
28030 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f  d be the only ro
28040 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
28050 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69 73  ile that are vis
28060 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a  ible from other.
28070 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** files..**.** 
28080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28090 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69  called once duri
280a0 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61  ng SQLite initia
280b0 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20  lization and by 
280c0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65  a.** single thre
280d0 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ad.  The memory 
280e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d  allocation and m
280f0 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
28100 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65  have not.** nece
28110 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69  ssarily been ini
28120 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
28130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
28140 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65  lled, and so the
28150 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20  y.** should not 
28160 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  be used..*/.int 
28170 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
28180 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20  void){ .  /* .  
28190 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
281a0 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61   macro defines a
281b0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  n initializer fo
281c0 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  r an sqlite3_vfs
281d0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
281e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
281f0 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20  S is NAME.  The 
28200 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
28210 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
28220 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22  er.  ** to the "
28230 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
28240 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73 20  .  (pAppData is 
28250 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
28260 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20  ointer because. 
28270 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75   ** silly C90 ru
28280 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20 76  les prohibit a v
28290 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20  oid* from being 
282a0 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69  cast to a functi
282b0 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  on pointer.  ** 
282c0 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 74  and so we have t
282d0 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65  o go through the
282e0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f   intermediate po
282f0 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70  inter to avoid p
28300 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65  roblems.  ** whe
28310 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  n compiling with
28320 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
28330 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a  s on GCC.).  **.
28340 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20    ** The FINDER 
28350 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
28360 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e  s macro is the n
28370 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ame of the point
28380 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  er to the.  ** f
28390 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20  inder-function. 
283a0 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   The finder-func
283b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
283c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20  ointer to the.  
283d0 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74  ** sqlite_io_met
283e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74  hods object that
283f0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
28400 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a  desired locking.
28410 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20    ** behaviors. 
28420 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69 6f   See the divisio
28430 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e  n above that con
28440 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48  tains the IOMETH
28450 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66  ODS.  ** macro f
28460 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f  or addition info
28470 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65  rmation on finde
28480 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  r-functions..  *
28490 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  *.  ** Most find
284a0 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ers simply retur
284b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
284c0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
284d0 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f  o_methods.  ** o
284e0 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65 20  bject.  But the 
284f0 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  "autolockIoFinde
28500 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  r" available on 
28510 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69  MacOSX does a li
28520 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  ttle.  ** more t
28530 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f  han that; it loo
28540 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
28550 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20 68  stem type that h
28560 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64  osts the .  ** d
28570 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
28580 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65   tries to choose
28590 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68   an locking meth
285a0 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  od appropriate f
285b0 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c  or.  ** that fil
285c0 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20  esystem time..  
285d0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49  */.  #define UNI
285e0 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49  XVFS(VFSNAME, FI
285f0 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20 20  NDER) {         
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28610 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20  .    1,         
28620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
28630 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28650 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69     sizeof(unixFi
28660 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
28670 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  File */         
28680 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28690 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20   MAX_PATHNAME,  
286a0 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
286b0 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
286c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30           \.    0
286d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
286e0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53         \.    VFS
28710 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20  NAME,           
28720 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20     /* zName */  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64       \.    (void
28750 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20  *)&FINDER,      
28760 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20   /* pAppData */ 
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65     \.    unixOpe
28790 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
287a0 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20  * xOpen */      
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74   \.    unixDelet
287d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
287e0 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20  xDelete */      
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28800 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c  .    unixAccess,
28810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
28820 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  ccess */        
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28840 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e     unixFullPathn
28850 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
28860 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  lPathname */    
28870 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28880 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20   unixDlOpen,    
28890 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
288a0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
288b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
288c0 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  nixDlError,     
288d0 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
288e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
288f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
28900 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  xDlSym,         
28910 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20     /* xDlSym */ 
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
28940 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
28950 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20   /* xDlClose */ 
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e     \.    unixRan
28980 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
28990 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70   \.    unixSleep
289c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
289d0 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20  xSleep */       
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
289f0 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74  .    unixCurrent
28a00 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
28a10 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20  urrentTime */   
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28a30 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72     unixGetLastEr
28a40 72 6f 72 20 20 20 20 20 20 2f 2a 20 78 47 65 74  ror      /* xGet
28a50 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20  LastError */    
28a60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
28a70 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20  ..  /*.  ** All 
28a80 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f  default VFSes fo
28a90 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61  r unix are conta
28aa0 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ined in the foll
28ab0 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a  owing array..  *
28ac0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
28ad0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
28ae0 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  .pNext field of 
28af0 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69  the VFS object i
28b00 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20  s modified.  ** 
28b10 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  by the SQLite co
28b20 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20  re when the VFS 
28b30 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20  is registered.  
28b40 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  So the following
28b50 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e  .  ** array cann
28b60 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a  ot be const..  *
28b70 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  /.  static sqlit
28b80 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20  e3_vfs aVfs[] = 
28b90 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  {.#if SQLITE_ENA
28ba0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28bb0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
28bc0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58  PPLE__).    UNIX
28bd0 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20  VFS("unix",     
28be0 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46       autolockIoF
28bf0 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20  inder ),.#else. 
28c00 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
28c10 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69  ",          posi
28c20 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  xIoFinder ),.#en
28c30 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28  dif.    UNIXVFS(
28c40 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20  "unix-none",    
28c50 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20   nolockIoFinder 
28c60 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
28c70 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20  unix-dotfile",  
28c80 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  dotlockIoFinder 
28c90 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ),.#if OS_VXWORK
28ca0 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
28cb0 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73  nix-namedsem", s
28cc0 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  emIoFinder ),.#e
28cd0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
28ce0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28cf0 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53  TYLE.    UNIXVFS
28d00 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20  ("unix-posix",  
28d10 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
28d20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
28d30 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20  unix-flock",    
28d40 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  flockIoFinder ),
28d50 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
28d60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
28d70 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
28d80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
28d90 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
28da0 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f  afp",      afpIo
28db0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
28dc0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
28dd0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
28de0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
28df0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
28e00 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
28e10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28e20 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
28e30 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
28e40 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
28e50 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
28e60 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
28e70 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
28e80 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
28e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
28ea0 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
28eb0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
28ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28ed0 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
28ee0 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
28ef0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
28f00 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
28f10 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
28f20 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
28f30 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
28f40 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
28f50 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
28f60 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
28f70 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
28f80 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
28f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28fa0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
28fb0 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
28fc0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
28fd0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
28fe0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
28ff0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
29000 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.