/ Hex Artifact Content
Login

Artifact 0482b132e8f1617276661276dd49e6b0ebe1db49:


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 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69 6e  nix only */..#in
0850: 63 6c 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e  clude "btreeInt.
0860: 68 22 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h"           /* 
0870: 55 73 65 20 62 79 20 41 70 70 6c 65 20 65 78 74  Use by Apple ext
0880: 65 6e 73 69 6f 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  ensions only */.
0890: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ../*.** There ar
08a0: 65 20 76 61 72 69 6f 75 73 20 6d 65 74 68 6f 64  e various method
08b0: 73 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69  s for file locki
08c0: 6e 67 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 63  ng used for conc
08d0: 75 72 72 65 6e 63 79 0a 2a 2a 20 63 6f 6e 74 72  urrency.** contr
08e0: 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50  ol:.**.**   1. P
08f0: 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68  OSIX locking (th
0900: 65 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20  e default),.**  
0910: 20 32 2e 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a   2. No locking,.
0920: 2a 2a 20 20 20 33 2e 20 44 6f 74 2d 66 69 6c 65  **   3. Dot-file
0930: 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34   locking,.**   4
0940: 2e 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  . flock() lockin
0950: 67 2c 0a 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c  g,.**   5. AFP l
0960: 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79  ocking (OSX only
0970: 29 2c 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64  ),.**   6. Named
0980: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
0990: 73 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29  s (VXWorks only)
09a0: 2c 0a 2a 2a 20 20 20 37 2e 20 70 72 6f 78 79 20  ,.**   7. proxy 
09b0: 6c 6f 63 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e  locking. (OSX on
09c0: 6c 79 29 0a 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73  ly).**.** Styles
09d0: 20 34 2c 20 35 2c 20 61 6e 64 20 37 20 61 72 65   4, 5, and 7 are
09e0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
09f0: 6f 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  of SQLITE_ENABLE
0a00: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a  _LOCKING_STYLE.*
0a10: 2a 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  * is defined to 
0a20: 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f 45  1.  The SQLITE_E
0a30: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a40: 59 4c 45 20 61 6c 73 6f 20 65 6e 61 62 6c 65 73  YLE also enables
0a50: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 73 65   automatic.** se
0a60: 6c 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  lection of the a
0a70: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
0a80: 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f  ng style based o
0a90: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
0aa0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 64 61  .** where the da
0ab0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 61 74 65  tabase is locate
0ac0: 64 2e 20 20 0a 2a 2f 0a 23 69 66 20 21 64 65 66  d.  .*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0ae0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0af0: 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
0b00: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
0b10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
0b20: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0b30: 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
0b40: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0b50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0b60: 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
0b70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0b80: 66 69 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f  fine the OS_VXWO
0b90: 52 4b 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f  RKS pre-processo
0ba0: 72 20 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20  r macro to 1 if 
0bb0: 62 75 69 6c 64 69 6e 67 20 6f 6e 20 0a 2a 2a 20  building on .** 
0bc0: 76 78 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f 74  vxworks, or 0 ot
0bd0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23 69 66 6e  herwise..*/.#ifn
0be0: 64 65 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23  def OS_VXWORKS.#
0bf0: 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52    if defined(__R
0c00: 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  TP__) || defined
0c10: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20  (_WRS_KERNEL).# 
0c20: 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57     define OS_VXW
0c30: 4f 52 4b 53 20 31 0a 23 20 20 65 6c 73 65 0a 23  ORKS 1.#  else.#
0c40: 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58      define OS_VX
0c50: 57 4f 52 4b 53 20 30 0a 23 20 20 65 6e 64 69 66  WORKS 0.#  endif
0c60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c70: 68 65 73 65 20 23 64 65 66 69 6e 65 73 20 73 68  hese #defines sh
0c80: 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e 32 47 42  ould enable >2GB
0c90: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e   file support on
0ca0: 20 50 6f 73 69 78 20 69 66 20 74 68 65 0a 2a 2a   Posix if the.**
0cb0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
0cc0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
0cd0: 70 6f 72 74 73 20 69 74 2e 20 20 49 66 20 74 68  ports it.  If th
0ce0: 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61  e OS lacks.** la
0cf0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
0d00: 2c 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62  , these should b
0d10: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20  e no-ops..**.** 
0d20: 4c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  Large file suppo
0d30: 72 74 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c  rt can be disabl
0d40: 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53  ed using the -DS
0d50: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
0d60: 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74  S switch.** on t
0d70: 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d  he compiler comm
0d80: 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20  and line.  This 
0d90: 69 73 20 6e 65 63 65 73 73 61 72 79 20 69 66 20  is necessary if 
0da0: 79 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e  you are compilin
0db0: 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74  g.** on a recent
0dc0: 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65   machine (ex: Re
0dd0: 64 48 61 74 20 37 2e 32 29 20 62 75 74 20 79 6f  dHat 7.2) but yo
0de0: 75 20 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65  u want your code
0df0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61   to work.** on a
0e00: 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20  n older machine 
0e10: 28 65 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29  (ex: RedHat 6.0)
0e20: 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c  .  If you compil
0e30: 65 20 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a  e on RedHat 7.2.
0e40: 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ** without this 
0e50: 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65  option, LFS is e
0e60: 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20  nable.  But LFS 
0e70: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
0e80: 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20  n the kernel.** 
0e90: 69 6e 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73  in RedHat 6.0, s
0ea0: 6f 20 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74  o the code won't
0eb0: 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66   work.  Hence, f
0ec0: 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72  or maximum binar
0ed0: 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79  y.** portability
0ee0: 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74   you should omit
0ef0: 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   LFS..**.** The 
0f00: 70 72 65 76 69 6f 75 73 20 70 61 72 61 67 72 61  previous paragra
0f10: 70 68 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ph was written i
0f20: 6e 20 32 30 30 35 2e 20 20 28 54 68 69 73 20 70  n 2005.  (This p
0f30: 61 72 61 67 72 61 70 68 20 69 73 20 77 72 69 74  aragraph is writ
0f40: 74 65 6e 0a 2a 2a 20 6f 6e 20 32 30 30 38 2d 31  ten.** on 2008-1
0f50: 31 2d 32 38 2e 29 20 54 68 65 73 65 20 64 61 79  1-28.) These day
0f60: 73 2c 20 61 6c 6c 20 4c 69 6e 75 78 20 6b 65 72  s, all Linux ker
0f70: 6e 65 6c 73 20 73 75 70 70 6f 72 74 20 6c 61 72  nels support lar
0f80: 67 65 20 66 69 6c 65 73 2c 20 73 6f 0a 2a 2a 20  ge files, so.** 
0f90: 79 6f 75 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  you should proba
0fa0: 62 6c 79 20 6c 65 61 76 65 20 4c 46 53 20 65 6e  bly leave LFS en
0fb0: 61 62 6c 65 64 2e 20 20 42 75 74 20 73 6f 6d 65  abled.  But some
0fc0: 20 65 6d 62 65 64 64 65 64 20 70 6c 61 74 66 6f   embedded platfo
0fd0: 72 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 6c 61 63  rms might.** lac
0fe0: 6b 20 4c 46 53 20 69 6e 20 77 68 69 63 68 20 63  k LFS in which c
0ff0: 61 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 44  ase the SQLITE_D
1000: 49 53 41 42 4c 45 5f 4c 46 53 20 6d 61 63 72 6f  ISABLE_LFS macro
1010: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 62 65 20   might still be 
1020: 75 73 65 66 75 6c 2e 0a 2a 2f 0a 23 69 66 6e 64  useful..*/.#ifnd
1030: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1040: 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f  E_LFS.# define _
1050: 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20  LARGE_FILE      
1060: 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c   1.# ifndef _FIL
1070: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20  E_OFFSET_BITS.# 
1080: 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f    define _FILE_O
1090: 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20  FFSET_BITS 64.# 
10a0: 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f  endif.# define _
10b0: 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45  LARGEFILE_SOURCE
10c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
10d0: 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64   standard includ
10e0: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63  e files..*/.#inc
10f0: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
1100: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1110: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
1120: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63  e <fcntl.h>.#inc
1130: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
1140: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
1150: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1160: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
1170: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 6e 64   <errno.h>.#ifnd
1180: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1190: 41 4c 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  AL.#include <sys
11a0: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
11b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
11c0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11d0: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  E.# include <sys
11e0: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c  /ioctl.h>.# incl
11f0: 75 64 65 20 3c 75 75 69 64 2f 75 75 69 64 2e 68  ude <uuid/uuid.h
1200: 3e 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  >.# if defined(_
1210: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
1220: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
1230: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
1240: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e          (__IPHON
1270: 45 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  E_OS_VERSION_MIN
1280: 5f 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30  _REQUIRED > 2000
1290: 29 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  )).#  define HAV
12a0: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
12b0: 23 20 65 6e 64 69 66 0a 23 20 69 66 20 4f 53 5f  # endif.# if OS_
12c0: 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75  VXWORKS.#  inclu
12d0: 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e  de <semaphore.h>
12e0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d  .#  include <lim
12f0: 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20  its.h>.# else.# 
1300: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66 69   include <sys/fi
1310: 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  le.h>.#  include
1320: 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23   <sys/param.h>.#
1330: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1340: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1350: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1370: 50 50 4c 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49  PPLE__) || (SQLI
1380: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1390: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
13a0: 58 57 4f 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64  XWORKS).# includ
13b0: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
13c0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
13d0: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
13e0: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
13f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
1400: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
1410: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
1420: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
1430: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
1440: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
1450: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
1460: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
1470: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
1480: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
1490: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
14a0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
14b0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
14c0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
14d0: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
14e0: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
14f0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1500: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
1510: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1520: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1530: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
1540: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1550: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1560: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1570: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1580: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1590: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
15a0: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
15b0: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
15c0: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
15d0: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
15e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
15f0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1600: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1610: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1620: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1630: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1640: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1650: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1660: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1670: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1680: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1690: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
16a0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
16b0: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
16c0: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
16d0: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
16e0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
16f0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
1700: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
1710: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
1720: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
1730: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1740: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1750: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1760: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1770: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1780: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1790: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
17a0: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
17b0: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
17c0: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
17d0: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
17e0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
17f0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
1800: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1810: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
1820: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
1830: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1840: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1850: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1860: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1870: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1880: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1890: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
18a0: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
18b0: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
18c0: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
18d0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
18e0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
18f0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1900: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
1910: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
1920: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1930: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1940: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1950: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1960: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1970: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1980: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1990: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
19a0: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
19b0: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
19e0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
19f0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1a10: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
1a20: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
1a30: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1a40: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1a50: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1a60: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1a70: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1a80: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1a90: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1aa0: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1ab0: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1ac0: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1ad0: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1ae0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1af0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1b00: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
1b10: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
1b20: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
1b30: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1b40: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1b50: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1b60: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  t entry */.  sql
1b70: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74   /* The VFS that
1ba0: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e   created this un
1bb0: 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  ixFile */.  unix
1bc0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1bd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1be0: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
1bf0: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
1c00: 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c30: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1c40: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
1c50: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c70: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1c80: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1c90: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  /.  unsigned sho
1ca0: 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  rt int ctrlFlags
1cb0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76  ;       /* Behav
1cc0: 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49  ioral bits.  UNI
1cd0: 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
1ce0: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1d10: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1d20: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1d30: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1d40: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1d50: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1d60: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1d70: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1d80: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1da0: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1db0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1dc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1dd0: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1de0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1df0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1e00: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1e30: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1e40: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1e50: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1e80: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1e90: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1ea0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1eb0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1ec0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 6e  (__APPLE__).  in
1ed0: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73    /* The flags s
1f00: 70 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e  pecified at open
1f10: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1f20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
1f30: 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
1f40: 20 69 6e 74 20 70 72 6f 74 46 6c 61 67 73 3b 20   int protFlags; 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 70 72 6f       /* Data pro
1f70: 74 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 72  tection flags fr
1f80: 6f 6d 20 75 6e 69 78 4f 70 65 6e 20 2a 2f 0a 23  om unixOpen */.#
1f90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1fa0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1fb0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1fc0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1fd0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
2000: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
2010: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
2020: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2030: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
2040: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
2050: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
2060: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2080: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
2090: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
20a0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
20b0: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
20c0: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
20d0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
20e0: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
2100: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
2110: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
2120: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
2130: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
2140: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2150: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
2160: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
2170: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
2180: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
2190: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
21a0: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
21b0: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
21c0: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
21d0: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
21e0: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
21f0: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
2200: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
2210: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
2220: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
2230: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2240: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2250: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2260: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
2270: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
2280: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
2290: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
22a0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
22b0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
22c0: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
22d0: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
22e0: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
22f0: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
2300: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2310: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2320: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2330: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2340: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2350: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2360: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2370: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2380: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
2390: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
23a0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
23b0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23c0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
23d0: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
23e0: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
23f0: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
2400: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
2410: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a       0x01     /*
2420: 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   Connections fro
2430: 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e  m one process on
2440: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2450: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  IXFILE_RDONLY   
2460: 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43     0x02     /* C
2470: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
2480: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
2490: 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  e UNIXFILE_PERSI
24a0: 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20  ST_WAL 0x04     
24b0: 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41  /* Persistent WA
24c0: 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  L mode */.#ifnde
24d0: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
24e0: 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e  _DIRSYNC.# defin
24f0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
2500: 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  NC    0x08     /
2510: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
2520: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65   needed */.#else
2530: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2540: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2550: 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  00.#endif.#defin
2560: 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  e UNIXFILE_PSOW 
2570: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
2580: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
2590: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
25a0: 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ITE */.#define U
25b0: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20  NIXFILE_DELETE  
25c0: 20 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20      0x20     /* 
25d0: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
25e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
25f0: 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20  ILE_URI         
2600: 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65  0x40     /* File
2610: 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20  name might have 
2620: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
2630: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2640: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20  FILE_NOLOCK     
2650: 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20   0x80     /* Do 
2660: 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  no file locking 
2670: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
2680: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
2690: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
26a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
26b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
26c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
26d0: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
26e0: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
26f0: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
2700: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
2710: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2720: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2730: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
2740: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2750: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
2760: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2770: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2780: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2790: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
27a0: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
27b0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
27c0: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
27d0: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
27e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
27f0: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
2800: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
2810: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
2820: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
2830: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2840: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
2850: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2860: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2870: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
2880: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
2890: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
28a0: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
28b0: 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  __.#define SQLIT
28c0: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
28d0: 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  CK 1.#endif..#if
28e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
28f0: 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64  UPERLOCK.#includ
2900: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69  e "sqlite3.h".#i
2910: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
2920: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
2930: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  rt.h>../*.** A s
2940: 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c  tructure to coll
2950: 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  ect a busy-handl
2960: 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  er callback and 
2970: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63  argument and a c
2980: 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  ount.** of the n
2990: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69  umber of times i
29a0: 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  t has been invok
29b0: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75  ed..*/.struct Su
29c0: 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20  perlockBusy {.  
29d0: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
29e0: 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  d*,int);        
29f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2a00: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2a10: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
2a20: 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20  BusyArg;        
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a40: 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
2a50: 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20   xBusy */.  int 
2a60: 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  nBusy;          
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a80: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78  umber of times x
2a90: 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e  Busy has been in
2aa0: 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  voked */.};.type
2ab0: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2ac0: 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f  lockBusy Superlo
2ad0: 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ckBusy;../*.** A
2ae0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2af0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2b00: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2b10: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
2b20: 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e  ve.** superlock.
2b30: 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64   The opaque hand
2b40: 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  le returned by s
2b50: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2b60: 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74  lock() is.** act
2b70: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2b80: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2b90: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2ba0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2bb0: 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65  rlock {.  sqlite
2bc0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2be0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65  abase handle use
2bf0: 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a  d to lock db */.
2c00: 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20    int bWal;     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20    /* True if db 
2c30: 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  is a WAL databas
2c40: 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  e */.};.typedef 
2c50: 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b  struct Superlock
2c60: 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a   Superlock;../*.
2c70: 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e  ** The pCtx poin
2c80: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
2c90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2ca0: 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
2cb0: 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c  r to a.** Superl
2cc0: 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72  ockBusy structur
2cd0: 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  e. Invoke the bu
2ce0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2cf0: 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ion encapsulated
2d00: 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63  .** by the struc
2d10: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
2d20: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
2d30: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
2d40: 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76  ockBusyHandler(v
2d50: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55  oid *pCtx, int U
2d60: 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c  NUSED){.  Superl
2d70: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d  ockBusy *pBusy =
2d80: 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20   (SuperlockBusy 
2d90: 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42  *)pCtx;.  if( pB
2da0: 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20  usy->xBusy==0 ) 
2db0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2dc0: 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28  rn pBusy->xBusy(
2dd0: 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c  pBusy->pBusyArg,
2de0: 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29   pBusy->nBusy++)
2df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2e00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2e10: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2e20: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2e30: 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  se file for .** 
2e40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
2e50: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
2e60: 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20  e or not. If no 
2e70: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2e80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2e90: 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20   file is in WAL 
2ea0: 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c  mode, set *pbWal
2eb0: 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74   to true and ret
2ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2ed0: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69  * If it is not i
2ee0: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2ef0: 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e  *pbWal to false.
2f00: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2f10: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
2f20: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
2f30: 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75  r code. The valu
2f40: 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69  e of *pbWal.** i
2f50: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
2f60: 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
2f70: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
2f80: 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b  kIsWal(Superlock
2f90: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
2fa0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2fc0: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2fd0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2fe0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2ff0: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47  /* Compiled PRAG
3000: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
3010: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
3020: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
3030: 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  pare(pLock->db, 
3040: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
3050: 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20  rnal_mode", -1, 
3060: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
3070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3080: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3090: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b  pLock->bWal = 0;
30a0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
30b0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
30c0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f  pStmt) ){.    co
30d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
30e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
30f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3100: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
3110: 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20     if( zMode && 
3120: 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33  strlen(zMode)==3
3130: 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
3140: 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64  icmp("wal", zMod
3150: 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  e, 3)==0 ){.    
3160: 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20    pLock->bWal = 
3170: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
3180: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
3190: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
31a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
31b0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  an exclusive shm
31c0: 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62  -lock on nByte b
31d0: 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ytes starting at
31e0: 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f   offset idx.** o
31f0: 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49  f the file fd. I
3200: 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
3210: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
3220: 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b  mediately, invok
3230: 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61  e.** the busy-ha
3240: 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68  ndler until eith
3250: 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  er it is obtaine
3260: 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61  d or the busy-ha
3270: 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ndler.** callbac
3280: 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a  k returns 0..*/.
3290: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
32a0: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  lockShmLock(.  s
32b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
32e0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
32f0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3310: 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63  ffset of shm-loc
3320: 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20  k to obtain */. 
3330: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3360: 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74  nsective bytes t
3370: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65  o lock */.  Supe
3380: 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79  rlockBusy *pBusy
3390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
33a0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70  usy-handler wrap
33b0: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  per object */.){
33c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
33d0: 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c   (*xShmLock)(sql
33e0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c  ite3_file*, int,
33f0: 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d   int, int) = fd-
3400: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
3410: 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ock;.  do {.    
3420: 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64  rc = xShmLock(fd
3430: 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51  , idx, nByte, SQ
3440: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51  LITE_SHM_LOCK|SQ
3450: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
3460: 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  VE);.  }while( r
3470: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
3480: 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48  & superlockBusyH
3490: 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70  andler((void *)p
34a0: 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65  Busy, 0) );.  re
34b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34c0: 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74  * Obtain the ext
34d0: 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ra locks on the 
34e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65  database file re
34f0: 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64  quired for WAL d
3500: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76  atabases..** Inv
3510: 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  oke the supplied
3520: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73   busy-handler as
3530: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
3540: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
3550: 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckWalLock(.  sql
3560: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3580: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
3590: 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61  open on WAL data
35a0: 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c  base */.  Superl
35b0: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
35c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
35d0: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
35e0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
35f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3620: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
3630: 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20  e *fd = 0;      
3640: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74       /* Main dat
3650: 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
3660: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  e */.  void vola
3670: 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  tile *p = 0;    
3680: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3690: 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
36a0: 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  of shared memory
36b0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
36c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  e sqlite3_file o
36e0: 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68  bject open on th
36f0: 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20  e main db file. 
3700: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
3710: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3720: 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
3730: 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
3740: 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66  NTER, (void *)&f
3750: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
3760: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
3770: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69   rc;..  /* Obtai
3780: 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22  n the "recovery"
3790: 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   lock. Normally,
37a0: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e   this lock is on
37b0: 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20  ly obtained by. 
37c0: 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e   ** clients runn
37d0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63  ing database rec
37e0: 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  overy.  .  */.  
37f0: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68  rc = superlockSh
3800: 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20  mLock(fd, 2, 1, 
3810: 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  pBusy);.  if( rc
3820: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
3830: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a  turn rc;..  /* Z
3840: 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66  ero the start of
3850: 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65   the first share
3860: 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54  d-memory page. T
3870: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
3880: 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  ny.  ** clients 
3890: 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f  that open read o
38a0: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
38b0: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  ions from this p
38c0: 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a  oint on will.  *
38d0: 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65  * have to run re
38e0: 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72  covery before pr
38f0: 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20  oceeding. Since 
3900: 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72  they need the "r
3910: 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f  ecovery".  ** lo
3920: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  ck that this pro
3930: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
3940: 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e  to do that, no n
3950: 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ew read or write
3960: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
3970: 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70  ns may now be op
3980: 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20  ened. Nor can a 
3990: 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75  checkpoint be ru
39a0: 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  n, for the.  ** 
39b0: 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a  same reason..  *
39c0: 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65  /.  rc = fd->pMe
39d0: 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66  thods->xShmMap(f
39e0: 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31  d, 0, 32*1024, 1
39f0: 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21  , &p);.  if( rc!
3a00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3a10: 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
3a20: 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33  ((void *)p, 0, 3
3a30: 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  2);..  /* Obtain
3a40: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
3a50: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61   on all the "rea
3a60: 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f  d-lock" slots. O
3a70: 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a  nce these locks.
3a80: 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69    ** are held, i
3a90: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3aa0: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
3ab0: 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c  o active reader,
3ac0: 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a   writer or .  **
3ad0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c   checkpointer cl
3ae0: 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  ients..  */.  rc
3af0: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
3b00: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3b10: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70  E_SHM_NLOCK-3, p
3b20: 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  Busy);.  return 
3b30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
3b40: 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b  ease a superlock
3b50: 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62   held on a datab
3b60: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
3b70: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
3b80: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
3b90: 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  on must have bee
3ba0: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
3bb0: 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
3bc0: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64  l to.** sqlite3d
3bd0: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e  emo_superlock().
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3bf0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3c00: 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c  runlock(void *pL
3c10: 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  ock){.  Superloc
3c20: 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63  k *p = (Superloc
3c30: 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28  k *)pLock;.  if(
3c40: 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20   p->bWal ){.    
3c50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3c80: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  /.    int flags 
3c90: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  = SQLITE_SHM_UNL
3ca0: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
3cb0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
3cc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3cd0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
3ce0: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
3cf0: 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
3d00: 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
3d10: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20  FILE_POINTER,.  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
3d40: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3d60: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3d70: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3d80: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3d90: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3da0: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3db0: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3dc0: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3dd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3de0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3e00: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3e10: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3e20: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3e30: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3e40: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3e50: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3e60: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3e70: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3e80: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3e90: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3ea0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3eb0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3ec0: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3ed0: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3ee0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3ef0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3f00: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3f10: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3f20: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3f30: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3f40: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
3f50: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
3f60: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
3f70: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
3f80: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
3f90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
3fa0: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
3fb0: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
3fc0: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
3fd0: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
3fe0: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
3ff0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
4000: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
4010: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
4020: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
4030: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
4040: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
4050: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
4060: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
4070: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
4080: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
4090: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
40a0: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
40b0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
40c0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
40d0: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
40e0: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
40f0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
4100: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
4110: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
4120: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
4130: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
4140: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
4150: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4160: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
4170: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
4180: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
4190: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
41a0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67   Additional flag
41d0: 73 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c  s to pass to sql
41e0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a  ite3_open_v2 */.
41f0: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
4200: 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20  oid*,int),      
4210: 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65    /* Busy handle
4220: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
4230: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20  void *pBusyArg, 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66  /* Context arg f
4260: 6f 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  or busy handler 
4270: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f  */.  void **ppLo
4280: 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ck              
4290: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e       /* OUT: Con
42a0: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
42b0: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f  superunlock() */
42c0: 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42  .){.  SuperlockB
42d0: 75 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30  usy busy = {0, 0
42e0: 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61  , 0}; /* Busy ha
42f0: 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62  ndler wrapper ob
4300: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
4310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
4330: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75  urn code */.  Su
4340: 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a  perlock *pLock;.
4350: 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  .  pLock = sqlit
4360: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
4370: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20  (Superlock));.  
4380: 69 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74  if( !pLock ) ret
4390: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
43a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b  ;.  memset(pLock
43b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65  , 0, sizeof(Supe
43c0: 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f  rlock));..  /* O
43d0: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 68  pen a database h
43e0: 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c  andle on the fil
43f0: 65 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e to superlock. 
4400: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
4410: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20  3_open_v2(.     
4420: 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e   zPath, &pLock->
4430: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
4440: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
4450: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61  _OPEN_CREATE|fla
4460: 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20  gs, zVfs.  );.. 
4470: 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75   /* Install a bu
4480: 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65  sy-handler and e
4490: 78 65 63 75 74 65 20 61 20 42 45 47 49 4e 20 45  xecute a BEGIN E
44a0: 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69  XCLUSIVE. If thi
44b0: 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20  s is not.  ** a 
44c0: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
44d0: 69 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65  is is all we nee
44e0: 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a  d to do.  .  **.
44f0: 20 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66    ** A wrapper f
4500: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
4510: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  to invoke the bu
4520: 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65  sy-handler inste
4530: 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ad of.  ** regis
4540: 74 65 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d  tering the busy-
4550: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
4560: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
4570: 20 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20   user directly. 
4580: 20 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e   ** with SQLite.
4590: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
45a0: 20 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68   the same busy-h
45b0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
45c0: 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f  may be.  ** invo
45d0: 6b 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74  ked directly lat
45e0: 65 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d  er on when attem
45f0: 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20  pting to obtain 
4600: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a  the extra locks.
4610: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e    ** required in
4620: 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73   WAL mode. By us
4630: 69 6e 67 20 74 68 65 20 77 72 61 70 70 65 72 2c  ing the wrapper,
4640: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
4650: 67 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74  guarantee.  ** t
4660: 68 61 74 20 74 68 65 20 22 6e 42 75 73 79 22 20  hat the "nBusy" 
4670: 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65  integer paramete
4680: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
4690: 75 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c  users busy-handl
46a0: 65 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  er.  ** represen
46b0: 74 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ts the total num
46c0: 62 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64  ber of busy-hand
46d0: 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ler invocations 
46e0: 6d 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a  made within.  **
46f0: 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71   this call to sq
4700: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
4710: 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67  ock(), including
4720: 20 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67   any made during
4730: 20 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e   the.  ** "BEGIN
4740: 20 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a   EXCLUSIVE"..  *
4750: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
4760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73  TE_OK ){.    bus
4770: 79 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b  y.xBusy = xBusy;
4780: 0a 20 20 20 20 62 75 73 79 2e 70 42 75 73 79 41  .    busy.pBusyA
4790: 72 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20  rg = pBusyArg;. 
47a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
47b0: 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64  handler(pLock->d
47c0: 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  b, superlockBusy
47d0: 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a  Handler, (void *
47e0: 29 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20  )&busy);.    rc 
47f0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
4800: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e  Lock->db, "BEGIN
4810: 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20   EXCLUSIVE", 0, 
4820: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
4830: 20 49 66 20 74 68 65 20 42 45 47 49 4e 20 45 58   If the BEGIN EX
4840: 43 4c 55 53 49 56 45 20 77 61 73 20 65 78 65 63  CLUSIVE was exec
4850: 75 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  uted successfull
4860: 79 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  y and this is a 
4870: 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  WAL.  ** databas
4880: 65 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63  e, call superloc
4890: 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  kWalLock() to ob
48a0: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
48b0: 6f 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20  ocks required.  
48c0: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  ** to prevent re
48d0: 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61  aders, writers a
48e0: 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  nd/or checkpoint
48f0: 65 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ers from accessi
4900: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77  ng the.  ** db w
4910: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
4920: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
4930: 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a   superlock..  **
4940: 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74  .  ** Before att
4950: 65 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20  empting any WAL 
4960: 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68  locks, commit th
4970: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
4980: 61 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a  arted above.  **
4990: 20 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c   to drop the WAL
49a0: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
49b0: 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20  locks currently 
49c0: 68 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  held. Otherwise,
49d0: 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41   the.  ** new WA
49e0: 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66  L locks may conf
49f0: 6c 69 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c  lict with the ol
4a00: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
4a10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4a20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
4a30: 3d 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  ==(rc = superloc
4a40: 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26  kIsWal(pLock)) &
4a50: 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b  & pLock->bWal ){
4a60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4a70: 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e  te3_exec(pLock->
4a80: 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
4a90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
4aa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ab0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
4ac0: 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b  superlockWalLock
4ad0: 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73  (pLock->db, &bus
4ae0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4af0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
4b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4b10: 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
4b20: 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
4b30: 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  ;.    *ppLock = 
4b40: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4b50: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
4b60: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4b70: 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75  c;.}../* A corru
4b80: 70 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b  pt DB won't work
4b90: 20 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61   with the sql-ba
4ba0: 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65  sed locking atte
4bb0: 6d 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a  mpt, grab an .**
4bc0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
4bd0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4be0: 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42  E_OK or SQLITE_B
4bf0: 55 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  USY if the lock 
4c00: 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e  fails .** return
4c10: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
4c20: 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e  ck level held on
4c30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f   sqlite3_file.*/
4c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4c50: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
4c60: 6b 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c  k_corrupt(.  sql
4c70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20  ite3_file *id,. 
4c80: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4c90: 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69  Lock,.  int *pFi
4ca0: 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78  leLock.){.  unix
4cb0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
4cc0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
4cd0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  nt eFileLock = p
4ce0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
4cf0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4d00: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4d10: 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65  eFileLock<eTarge
4d20: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4d30: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4d40: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4d50: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4d60: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ED);.  }.  if( !
4d70: 72 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43  rc && SQLITE_LOC
4d80: 4b 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65 74  K_SHARED<eTarget
4d90: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4da0: 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
4db0: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
4dc0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
4dd0: 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SIVE);.  }.  if(
4de0: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70   rc ){.    if( p
4df0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4e00: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4e10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74       pFile->pMet
4e20: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
4e30: 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
4e40: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
4e50: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c  ;.  }.  if (pFil
4e60: 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46  eLock) {.    *pF
4e70: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
4e80: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ock;.  }.  retur
4e90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4eb0: 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
4ec0: 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74  ck_corrupt(sqlit
4ed0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
4ee0: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
4ef0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4f00: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4f10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4f20: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4f30: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4f40: 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
4f50: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
4f60: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
4f70: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
4f80: 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20  _SHARED);.  }.  
4f90: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4fa0: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f   ){.    int unlo
4fc0: 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  ckRC = pFile->pM
4fd0: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
4fe0: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e  d, SQLITE_LOCK_N
4ff0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72  ONE);.    if (!r
5000: 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
5010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5020: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
5030: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
5040: 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a  PERLOCK */.../*.
5050: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
5060: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
5070: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
5080: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
5090: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
50a0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
50b0: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
50c0: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
50d0: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
50e0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
50f0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
5100: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
5110: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
5120: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
5130: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
5140: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
5150: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
5160: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
5170: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
5180: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
5190: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
51a0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
51b0: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
51c0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
51d0: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
51e0: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
51f0: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
5200: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
5210: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
5220: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
5230: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
5240: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
5250: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
5260: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
5270: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
5280: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
5290: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
52a0: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
52b0: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
52c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
52d0: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
52e0: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
52f0: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
5300: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
5310: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
5320: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
5330: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5340: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
5350: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
5360: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
5370: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
5380: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
5390: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
53a0: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
53b0: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
53c0: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
53d0: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
53e0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
53f0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
5400: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
5410: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
5420: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
5430: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
5440: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
5450: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
5460: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
5470: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
5480: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
5490: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
54a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
54c0: 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c  of the sytem cal
54d0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
54e0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
54f0: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
5500: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
5510: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5520: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5530: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
5540: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
5550: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
5560: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
5570: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5580: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
5590: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
55a0: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
55b0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
55c0: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
55d0: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
55e0: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
55f0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5600: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
5610: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
5620: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
5630: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
5650: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
5660: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
5670: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5680: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
5690: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
56a0: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
56b0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
56c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
56d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
56e0: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
56f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5700: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
5710: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
5720: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
5730: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
5740: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
5750: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
5760: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
5770: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5780: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
5790: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
57a0: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
57b0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
57c0: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
57d0: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
57e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
57f0: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
5800: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
5810: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
5820: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
5830: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
5840: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
5850: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
5860: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
5870: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
5880: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
5890: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
58a0: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
58b0: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
58c0: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
58d0: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
58e0: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
58f0: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
5900: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5920: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
5930: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
5940: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
5950: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
5960: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5970: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
5980: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5990: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
59a0: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
59b0: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
59c0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
59d0: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
59e0: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
59f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
5a00: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
5a10: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
5a20: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5a30: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
5a40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5a50: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
5a60: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5a70: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
5a80: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5a90: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
5aa0: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
5ab0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
5ac0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
5ad0: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
5ae0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5af0: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
5b00: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
5b10: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
5b20: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
5b30: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
5b40: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5b50: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5b60: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
5b70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5b80: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
5b90: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5ba0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
5bb0: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
5bc0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
5bd0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5be0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5bf0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5c00: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5c10: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
5c20: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
5c30: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5c40: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
5c50: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5c60: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
5c70: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
5c80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5c90: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
5ca0: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
5cb0: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
5cc0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5cd0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
5ce0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
5cf0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
5d00: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
5d10: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
5d20: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
5d30: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
5d40: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
5d50: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5d60: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
5d70: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
5d80: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
5d90: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5da0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
5db0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
5dc0: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
5dd0: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
5de0: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
5df0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
5e00: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
5e10: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
5e20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5e30: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
5e40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
5e50: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
5e60: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5e70: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5e80: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5e90: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
5ea0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
5eb0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
5ec0: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5ee0: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
5ef0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5f00: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
5f10: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
5f20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5f30: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
5f40: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
5f50: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
5f60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5f70: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
5f80: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
5f90: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
5fa0: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
5fb0: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
5fc0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
5fd0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
5fe0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
5ff0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
6000: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
6010: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
6020: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
6030: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6040: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
6050: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
6060: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
6070: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6080: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
6090: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
60a0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d  f.#define osFchm
60b0: 6f 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  od    ((int(*)(i
60c0: 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  nt,mode_t))aSysc
60d0: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
60e0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  )..#if defined(H
60f0: 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
6100: 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
6110: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b  IX_FALLOCATE.  {
6120: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
6130: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6140: 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c  l_ptr)posix_fall
6150: 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c  ocate,  0 },.#el
6160: 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74  se.  { "fallocat
6170: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
6180: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
61a0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
61b0: 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28  e osFallocate ((
61c0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
61d0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
61e0: 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [15].pCurrent)..
61f0: 20 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20    { "unlink",   
6200: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6210: 63 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c  call_ptr)unlink,
6220: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6230: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b  #define osUnlink
6240: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
6250: 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61  st char*))aSysca
6260: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
6270: 0a 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63  ..  { "openDirec
6280: 74 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74  tory",    (sqlit
6290: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f  e3_syscall_ptr)o
62a0: 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20  penDirectory,   
62b0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
62c0: 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  osOpenDirectory 
62d0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
62e0: 68 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63  har*,int*))aSysc
62f0: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
6300: 29 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20  )..  { "mkdir", 
6310: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6320: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69  syscall_ptr)mkdi
6330: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
6340: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69  ,.#define osMkdi
6350: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
6360: 6f 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f  onst char*,mode_
6370: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  t))aSyscall[18].
6380: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6390: 72 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  rmdir",        (
63a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
63b0: 70 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20  ptr)rmdir,      
63c0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
63d0: 65 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28  e osRmdir     ((
63e0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
63f0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  r*))aSyscall[19]
6400: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6410: 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20  "fchown",       
6420: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6430: 5f 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e  _ptr)posixFchown
6440: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69  ,     0 },.#defi
6450: 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28  ne osFchown    (
6460: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f  (int(*)(int,uid_
6470: 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c  t,gid_t))aSyscal
6480: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
6490: 0a 20 20 7b 20 22 75 6d 61 73 6b 22 2c 20 20 20  .  { "umask",   
64a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
64b0: 73 63 61 6c 6c 5f 70 74 72 29 75 6d 61 73 6b 2c  scall_ptr)umask,
64c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
64d0: 23 64 65 66 69 6e 65 20 6f 73 55 6d 61 73 6b 20  #define osUmask 
64e0: 20 20 20 20 28 28 6d 6f 64 65 5f 74 28 2a 29 28      ((mode_t(*)(
64f0: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
6500: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
6510: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6520: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
6530: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
6540: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
6550: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
6560: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
6570: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
6580: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
6590: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
65a0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
65b0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
65c0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
65d0: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
65e0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
65f0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6600: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6610: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6620: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6630: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
6640: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
6650: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
6660: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
6670: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
6680: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
6690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
66a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
66b0: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
66c0: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
66d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
66e0: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
66f0: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6700: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6710: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6720: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6730: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6740: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
6750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6760: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
6770: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
6780: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
6790: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
67a0: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
67b0: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
67c0: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
67d0: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
67e0: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
67f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6800: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6810: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6820: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6830: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6840: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6850: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6860: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6870: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6880: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
68a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
68b0: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
68c0: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
68d0: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
68e0: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
68f0: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6900: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6910: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6920: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6930: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6940: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6950: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6960: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6970: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6980: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
6990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
69a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
69b0: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
69c0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
69d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
69e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
69f0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6a00: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6a10: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6a20: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6a30: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6a40: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6a50: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6a90: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
6aa0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6ab0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6ac0: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
6ad0: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
6ae0: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6af0: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6b00: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6b10: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6b20: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6b40: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6b50: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6b60: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6b70: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6b80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6b90: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6ba0: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6bb0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6bc0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6bd0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6be0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6bf0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6c00: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6c10: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6c20: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6c30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6c40: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6c50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6c60: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6c70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6c80: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
6c90: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
6ca0: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
6cb0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6cc0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6cd0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6ce0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6cf0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6d00: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
6d10: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
6d20: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
6d30: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
6d40: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6d50: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
6d60: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
6d70: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
6d80: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6d90: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
6da0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6db0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
6dc0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6dd0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
6de0: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
6df0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6e00: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6e10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
6e20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6e30: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
6e40: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
6e50: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6e60: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6e70: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
6e80: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6e90: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
6ea0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
6eb0: 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73  ke open().  Do s
6ec0: 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  o multiple times
6ed0: 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65  , until it eithe
6ee0: 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a  r succeeds or.**
6ef0: 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20   fails for some 
6f00: 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61  reason other tha
6f10: 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49  n EINTR..**.** I
6f20: 66 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74  f the file creat
6f30: 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20  ion mode "m" is 
6f40: 30 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  0 then set it to
6f50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
6f60: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65  .** SQLite.  The
6f70: 20 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49   default is SQLI
6f80: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
6f90: 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72  PERMISSIONS (nor
6fa0: 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61  mally.** 0644) a
6fb0: 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  s modified by th
6fc0: 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20  e system umask. 
6fd0: 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20   If m is not 0, 
6fe0: 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65  then.** make the
6ff0: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
7000: 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d  ode be exactly m
7010: 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d   ignoring the um
7020: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ask..**.** The m
7030: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20   parameter will 
7040: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79  be non-zero only
7050: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d   when creating -
7060: 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  wal, -journal,.*
7070: 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73  * and -shm files
7080: 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65  .  We want those
7090: 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a   files to have *
70a0: 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d  exactly* the sam
70b0: 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73  e.** permissions
70c0: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
70d0: 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61  al database, una
70e0: 64 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68  dulterated by th
70f0: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74  e umask..** In t
7100: 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61  hat way, if a da
7110: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d  tabase file is -
7120: 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d  rw-rw-rw or -rw-
7130: 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20  rw-r-, and a.** 
7140: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73  transaction cras
7150: 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62  hes and leaves b
7160: 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61  ehind hot journa
7170: 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  ls, then any.** 
7180: 70 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20  process that is 
7190: 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  able to write to
71a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
71b0: 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20  ll also be able 
71c0: 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68  to.** recover th
71d0: 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  e hot journals..
71e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
71f0: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
7200: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
7210: 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74  mode_t m){.  int
7220: 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32   fd;.  mode_t m2
7230: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6f 72 69 67 4d  ;.  mode_t origM
7240: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6d 3d 3d 30   = 0;.  if( m==0
7250: 20 29 7b 0a 20 20 20 20 6d 32 20 3d 20 53 51 4c   ){.    m2 = SQL
7260: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
7270: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20  _PERMISSIONS;.  
7280: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 32 20 3d 20  }else{.    m2 = 
7290: 6d 3b 0a 20 20 20 20 6f 72 69 67 4d 20 3d 20 6f  m;.    origM = o
72a0: 73 55 6d 61 73 6b 28 30 29 3b 0a 20 20 7d 0a 20  sUmask(0);.  }. 
72b0: 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
72c0: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
72d0: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
72e0: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
72f0: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
7300: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
7310: 6e 64 69 66 0a 20 20 7d 77 68 69 6c 65 28 20 66  ndif.  }while( f
7320: 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  d<0 && errno==EI
7330: 4e 54 52 20 29 3b 0a 20 20 69 66 28 20 6d 20 29  NTR );.  if( m )
7340: 7b 0a 20 20 20 20 6f 73 55 6d 61 73 6b 28 6f 72  {.    osUmask(or
7350: 69 67 4d 29 3b 0a 20 20 7d 0a 23 69 66 20 64 65  igM);.  }.#if de
7360: 66 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43  fined(FD_CLOEXEC
7370: 29 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f  ) && (!defined(O
7380: 5f 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43  _CLOEXEC) || O_C
7390: 4c 4f 45 58 45 43 3d 3d 30 29 0a 20 20 69 66 28  LOEXEC==0).  if(
73a0: 20 66 64 3e 3d 30 20 29 20 6f 73 46 63 6e 74 6c   fd>=0 ) osFcntl
73b0: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
73c0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
73d0: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
73e0: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  EC);.#endif.  re
73f0: 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn fd;.}../*.*
7400: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
7410: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
7420: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
7430: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
7440: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
7450: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
7460: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
7470: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
7480: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7490: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
74a0: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
74b0: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
74c0: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
74d0: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
74e0: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
74f0: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
7500: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
7510: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
7520: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
7530: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
7540: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7550: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
7560: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
7570: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
7580: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
7590: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
75a0: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
75b0: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
75c0: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
75d0: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
75e0: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
75f0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
7600: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
7610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
7620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7630: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
7640: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
7650: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
7660: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
7670: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
7680: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
7690: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
76a0: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
76b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
76c0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
76d0: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
76e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
76f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
7700: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
7710: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7720: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
7730: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
7740: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
7750: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
7760: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48  E_DEBUG)./*.** H
7770: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
7780: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
7790: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
77a0: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
77b0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
77c0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
77d0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
77e0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
77f0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
7800: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
7810: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7820: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
7830: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
7840: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
7850: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
7860: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
7870: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
7880: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
7890: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
78a0: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
78b0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
78c0: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
78d0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
78e0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
78f0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
7900: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
7910: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
7920: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
7930: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
7940: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
7950: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
7960: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
7970: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
7980: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
7990: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
79a0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
79b0: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
79c0: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
79d0: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
79e0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
79f0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
7a00: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
7a10: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
7a20: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
7a30: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
7a40: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
7a50: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
7a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a70: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
7a80: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
7a90: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
7aa0: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
7ab0: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
7ac0: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
7ad0: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
7ae0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
7af0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
7b00: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
7b10: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
7b20: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
7b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f  }else{.    s = o
7b40: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
7b50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
7b60: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
7b70: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
7b80: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
7b90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
7ba0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
7bb0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
7bc0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
7bd0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
7be0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
7bf0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
7c00: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
7c10: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
7c20: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
7c30: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
7c40: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
7c50: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
7c60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
7c70: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
7c80: 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74   );.  s = osFcnt
7c90: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
7ca0: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
7cb0: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
7cc0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
7cd0: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
7ce0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
7cf0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
7d00: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
7d10: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
7d20: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
7d30: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
7d40: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d  d, s);.  if( s==
7d50: 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45  (-1) && op==F_SE
7d60: 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70  TLK && (p->l_typ
7d70: 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d  e==F_RDLCK || p-
7d80: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
7d90: 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
7da0: 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32  flock l2;.    l2
7db0: 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e   = *p;.    osFcn
7dc0: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
7dd0: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
7de0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
7df0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
7e00: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
7e10: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
7e20: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
7e30: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
7e40: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
7e50: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
7e60: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
7e70: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
7e80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7e90: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
7ea0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7eb0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
7ec0: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
7ed0: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
7ee0: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
7ef0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
7f00: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
7f10: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
7f20: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
7f30: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
7f40: 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20  urn s;.}.#undef 
7f50: 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20  osFcntl.#define 
7f60: 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  osFcntl lockTrac
7f70: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
7f80: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
7f90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74  ../*.** Retry ft
7fa0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20  runcate() calls 
7fb0: 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f  that fail due to
7fc0: 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63   EINTR.*/.static
7fd0: 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75   int robust_ftru
7fe0: 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c  ncate(int h, sql
7ff0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a  ite3_int64 sz){.
8000: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
8010: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
8020: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
8030: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
8040: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
8050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
8060: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
8070: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
8080: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
8090: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
80a0: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
80b0: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
80c0: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
80d0: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
80e0: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
80f0: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
8100: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
8110: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
8120: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
8130: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
8140: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
8150: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
8160: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
8170: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
8180: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
8190: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
81a0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
81b0: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
81c0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
81d0: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
81e0: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
81f0: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
8200: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
8210: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
8220: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
8230: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
8240: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
8250: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
8260: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
8270: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
8280: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
8290: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
82a0: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
82b0: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
82c0: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
82d0: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
82e0: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
82f0: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
8300: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
8310: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
8320: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
8330: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
8340: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
8350: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
8360: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
8370: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8380: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
8390: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
83a0: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
83b0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
83c0: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
83d0: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
83e0: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
83f0: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
8400: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
8410: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
8420: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
8430: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
8440: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
8450: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
8460: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
8470: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
8480: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
8490: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
84a0: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
84b0: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
84c0: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
84d0: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
84e0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
84f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8500: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
8510: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
8520: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
8530: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
8540: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
8550: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
8560: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
8570: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
8580: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
8590: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
85a0: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
85b0: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
85c0: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
85d0: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
85e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
85f0: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
8600: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
8610: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
8620: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
8630: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
8640: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
8650: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
8660: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
8670: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8680: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20  R_LOCK) || .    
8690: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
86a0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
86b0: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  _UNLOCK) || .   
86c0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
86d0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
86e0: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
86f0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
8700: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8710: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8720: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
8730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
8750: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
8760: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
8770: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
8780: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
8790: 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20    /* EDEADLK is 
87a0: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
87b0: 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c   a call to fcntl
87c0: 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61  (F_SETLKW) is ma
87d0: 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69  de. And.  ** thi
87e0: 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d  s module never m
87f0: 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c  akes such a call
8800: 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69  . And the code i
8810: 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20  n SQLite itself 
8820: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68  .  ** asserts th
8830: 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  at SQLITE_IOERR_
8840: 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72  BLOCKED is never
8850: 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74   returned. For t
8860: 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a  hese reasons.  *
8870: 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20 61  * this case is a
8880: 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
8890: 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  t. If the system
88a0: 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20   does set errno 
88b0: 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a  to EDEADLK,.  **
88c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c   the default SQL
88d0: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f  ITE_IOERR_XXX co
88e0: 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  de will be retur
88f0: 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ned. */.#if 0.  
8900: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
8910: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8920: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23  IOERR_BLOCKED;.#
8930: 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45  endif.    .#if E
8940: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
8950: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
8960: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
8970: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
8980: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
8990: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
89a0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
89b0: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
89c0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
89d0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
89e0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
89f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
8a00: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
8a10: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
8a20: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
8a30: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
8a40: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
8a50: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
8a60: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
8a70: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
8a80: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
8a90: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
8aa0: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
8ab0: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
8ac0: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
8ad0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
8ae0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
8af0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
8b00: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b20: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
8b30: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
8b40: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
8b50: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
8b60: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
8b70: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
8b80: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
8b90: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
8ba0: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
8bb0: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
8bc0: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
8bd0: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
8be0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
8bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
8c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
8c50: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
8c60: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
8c70: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
8c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
8c90: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
8ca0: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
8cb0: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
8cc0: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
8cd0: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
8ce0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
8cf0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
8d00: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
8d10: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
8d20: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
8d30: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
8d40: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
8d50: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
8d60: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
8d70: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
8d80: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
8d90: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
8da0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
8db0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
8dc0: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
8dd0: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
8de0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
8df0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8e00: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
8e10: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
8e20: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
8e30: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
8e40: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
8e50: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
8e60: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
8e70: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
8e80: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
8e90: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
8ea0: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
8eb0: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
8ec0: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
8ed0: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
8ee0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
8ef0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
8f00: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
8f10: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
8f20: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
8f30: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
8f40: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
8f50: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
8f60: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
8f70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
8f80: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
8f90: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
8fa0: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
8fb0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
8fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8fd0: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
8fe0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
8ff0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
9020: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
9030: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
9040: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
9050: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
9060: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
9070: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
9080: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
9090: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
90a0: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
90b0: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
90c0: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
90d0: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
90e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
90f0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
9100: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
9110: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
9120: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
9130: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
9140: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
9150: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
9160: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
9170: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
9180: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
9190: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
91a0: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
91b0: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
91c0: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
91d0: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
91e0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
91f0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
9200: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
9210: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
9220: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
9230: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
9240: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
9250: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
9260: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9270: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
9280: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
9290: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
92a0: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
92b0: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
92c0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
92d0: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
92e0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
92f0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
9300: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
9310: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
9320: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
9330: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
9340: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9350: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
9360: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
9370: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
9380: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
9390: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
93a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
93b0: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
93c0: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
93d0: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
93e0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
93f0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
9400: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
9410: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
9420: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
9430: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
9440: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9460: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
9470: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
9480: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
9490: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
94a0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
94b0: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
94c0: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
94d0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
94e0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
94f0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
9500: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
9510: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
9520: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
9530: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
9540: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
9550: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
9560: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
9570: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
9580: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
9590: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
95a0: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
95b0: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
95c0: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
95d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
95e0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
95f0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9600: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9610: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
9620: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9630: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
9640: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
9650: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
9660: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
9670: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
9680: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
9690: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
96a0: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
96b0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
96c0: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
96d0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
96e0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
96f0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
9700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9720: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
9730: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
9740: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
9750: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
9760: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
9770: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
9780: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
9790: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
97a0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
97b0: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
97c0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
97d0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
97e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
97f0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
9800: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
9810: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
9820: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
9830: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
9840: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
9850: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
9860: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
9870: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
9880: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
9890: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
98a0: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
98b0: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
98c0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
98d0: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
98e0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
98f0: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
9900: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
9910: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
9920: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
9930: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
9940: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
9950: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
9960: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
9970: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
9980: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
9990: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
99a0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
99b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
99c0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
99d0: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
99e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
99f0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
9a00: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
9a10: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
9a20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9a30: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
9a40: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
9a50: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
9a60: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
9a70: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
9a80: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
9a90: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
9aa0: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
9ab0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
9ac0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
9ad0: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
9ae0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
9af0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
9b00: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
9b10: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
9b20: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
9b30: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
9b40: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
9b50: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
9b60: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
9b70: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
9b80: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
9b90: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
9ba0: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
9bb0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9bc0: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
9bd0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
9be0: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
9bf0: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
9c00: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
9c10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9c20: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9c30: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
9c40: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
9c50: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
9c60: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
9c70: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
9c80: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
9c90: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
9ca0: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
9cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9cc0: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
9cd0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
9ce0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
9cf0: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
9d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
9d10: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
9d20: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
9d30: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
9d40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
9d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d90: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
9da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
9df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9e00: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
9e10: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
9e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
9e40: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
9e50: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
9e60: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
9e70: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
9e80: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
9e90: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
9ea0: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
9eb0: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
9ec0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
9ed0: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
9ee0: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
9ef0: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
9f00: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
9f10: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
9f20: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
9f30: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
9f40: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
9f50: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
9f60: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
9f70: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
9f80: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
9f90: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
9fa0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9fb0: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
9fc0: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
9fd0: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
9fe0: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
9ff0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
a000: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
a010: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
a020: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
a030: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
a040: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
a050: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
a060: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
a070: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
a080: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
a090: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
a0a0: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
a0b0: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
a0c0: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
a0d0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
a0e0: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
a0f0: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
a100: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
a110: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
a120: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
a130: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
a140: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
a150: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
a160: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
a170: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
a180: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
a190: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
a1a0: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
a1b0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
a1c0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
a1d0: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
a1e0: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
a1f0: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
a200: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
a210: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
a220: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
a230: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
a240: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
a250: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
a260: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
a270: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
a280: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
a290: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
a2a0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
a2b0: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
a2c0: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
a2d0: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
a2e0: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
a2f0: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
a300: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
a310: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
a320: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
a330: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
a340: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
a350: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
a360: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
a370: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
a380: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
a390: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
a3a0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
a3b0: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
a3c0: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
a3d0: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
a3e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
a3f0: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
a400: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
a410: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
a420: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
a430: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
a440: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
a450: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
a460: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
a470: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
a480: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
a490: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
a4a0: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
a4b0: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
a4c0: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
a4d0: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
a4e0: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
a4f0: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
a500: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
a510: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
a520: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
a530: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
a540: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
a550: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
a560: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
a570: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
a580: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
a590: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
a5a0: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
a5b0: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
a5c0: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
a5d0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
a5e0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
a5f0: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
a600: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
a610: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
a620: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
a630: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
a640: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
a650: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
a660: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
a670: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
a680: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
a690: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
a6a0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
a6b0: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
a6c0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
a6d0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
a6e0: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
a6f0: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
a700: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
a710: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
a720: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
a730: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
a740: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
a750: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
a760: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
a770: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
a780: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
a790: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
a7a0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
a7b0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
a7c0: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
a7d0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
a7e0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
a7f0: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
a800: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
a810: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
a820: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
a830: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
a840: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
a850: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
a860: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
a870: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
a880: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a890: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
a8a0: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
a8b0: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
a8c0: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
a8d0: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
a8e0: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
a8f0: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
a900: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
a910: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
a920: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
a930: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
a940: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
a950: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
a960: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
a970: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
a980: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
a990: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
a9a0: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
a9b0: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
a9c0: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
a9d0: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
a9e0: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
a9f0: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
aa00: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
aa10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
aa20: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
aa30: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
aa40: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
aa50: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
aa60: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
aa70: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
aa80: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
aa90: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
aaa0: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
aab0: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
aac0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
aad0: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
aae0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
aaf0: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
ab00: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
ab10: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
ab20: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
ab30: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
ab40: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
ab50: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
ab60: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
ab70: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
ab80: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
ab90: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
aba0: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
abb0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
abc0: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
abd0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
abe0: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
abf0: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
ac00: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
ac10: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
ac20: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
ac30: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
ac40: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
ac50: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
ac60: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
ac70: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
ac80: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
ac90: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
aca0: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
acb0: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
acc0: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
acd0: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
ace0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
acf0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
ad00: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
ad10: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
ad20: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
ad30: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
ad40: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
ad50: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
ad60: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
ad70: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
ad80: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
ad90: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
ada0: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
adb0: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
adc0: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
add0: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
ade0: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
adf0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
ae00: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
ae10: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
ae20: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
ae30: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
ae40: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
ae50: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
ae60: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
ae70: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
ae80: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
ae90: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
aea0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
aeb0: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
aec0: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
aed0: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
aee0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
aef0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
af00: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
af10: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
af20: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
af30: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
af40: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
af50: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
af60: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
af70: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
af80: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
af90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
afa0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
afb0: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
afc0: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
afd0: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
afe0: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
aff0: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
b000: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
b010: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
b020: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
b030: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
b040: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
b050: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
b060: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
b070: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
b080: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
b090: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
b0a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b0b0: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
b0c0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
b0d0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
b0e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
b0f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
b100: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
b110: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
b120: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
b130: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
b140: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
b150: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
b160: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b180: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
b190: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
b1a0: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
b1b0: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
b1c0: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
b1d0: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
b1e0: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
b1f0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
b200: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
b210: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
b220: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
b230: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
b240: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
b250: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
b260: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
b270: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
b280: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
b290: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
b2a0: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
b2b0: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
b2c0: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
b2d0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
b2e0: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
b2f0: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
b300: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
b310: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
b320: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
b330: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
b340: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
b350: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
b360: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
b370: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
b380: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
b390: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
b3a0: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
b3b0: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
b3c0: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
b3d0: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
b3e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
b3f0: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
b400: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
b410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b420: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
b430: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
b440: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
b450: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
b460: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
b470: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
b480: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
b490: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
b4a0: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
b4b0: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
b4c0: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
b4d0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
b4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b4f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b500: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
b510: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
b520: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
b530: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
b540: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
b550: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
b560: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
b570: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b590: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b5a0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
b5b0: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
b5c0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
b5d0: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
b5e0: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
b5f0: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
b600: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
b610: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
b620: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
b630: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
b640: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
b650: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b660: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
b670: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
b680: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
b690: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b6a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
b6b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
b6c0: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
b6d0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
b6e0: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
b6f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
b700: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
b710: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
b720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b730: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
b740: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
b750: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
b760: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
b770: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
b780: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
b790: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
b7a0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
b7b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
b7c0: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
b7d0: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
b7e0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
b7f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
b800: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
b810: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
b820: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
b830: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
b840: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
b850: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
b860: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b870: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
b880: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
b890: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
b8a0: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
b8b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
b8c0: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
b8d0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
b8e0: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
b8f0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
b900: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
b910: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
b920: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
b930: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
b940: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
b950: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
b960: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
b970: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
b980: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
b990: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
b9a0: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
b9b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b9c0: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
b9d0: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
b9e0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
b9f0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
ba00: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
ba10: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
ba20: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
ba30: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
ba40: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73  en") and the ass
ba50: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
ba60: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
ba70: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
ba80: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
ba90: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
baa0: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
bab0: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
bac0: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
bad0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
bae0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb00: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
bb10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
bb20: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
bb30: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
bb40: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
bb50: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
bb60: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb80: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
bb90: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
bba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
bbd0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
bbe0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
bbf0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
bc00: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
bc20: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
bc30: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
bc40: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
bc50: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
bc60: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
bc70: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
bc80: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
bc90: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
bca0: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
bcb0: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
bcc0: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
bcd0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
bce0: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
bcf0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
bd00: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
bd10: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
bd20: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
bd30: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
bd40: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
bd50: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
bd60: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
bd70: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
bd80: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
bd90: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
bda0: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
bdb0: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
bdc0: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
bdd0: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
bde0: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
bdf0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
be00: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
be10: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
be20: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
be30: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
be40: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
be50: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
be60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
be70: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
be80: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
be90: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
bea0: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
beb0: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
bec0: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
bed0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
bee0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
bef0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
bf00: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
bf10: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
bf20: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
bf30: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
bf40: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
bf50: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
bf60: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
bf70: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
bf80: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
bf90: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
bfa0: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
bfb0: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
bfc0: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
bfd0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
bfe0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
bff0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
c000: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
c010: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
c020: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
c030: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
c040: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
c050: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
c060: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
c070: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
c080: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
c090: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
c0a0: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
c0b0: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
c0c0: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
c0d0: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
c0e0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
c0f0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
c100: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
c110: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
c120: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
c130: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
c140: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
c150: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
c160: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
c170: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
c180: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
c190: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
c1a0: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
c1b0: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
c1c0: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  no);.#endif..  a
c1d0: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
c1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
c1f0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
c200: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
c210: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
c220: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
c230: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
c240: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
c250: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
c260: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
c270: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
c280: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
c290: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
c2a0: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
c2b0: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
c2c0: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
c2d0: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
c2e0: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
c2f0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
c300: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
c310: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
c320: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
c330: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
c340: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
c350: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
c360: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
c370: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
c380: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
c390: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
c3a0: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
c3b0: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
c3c0: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
c3d0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
c3e0: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
c3f0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
c400: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
c410: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
c420: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
c430: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
c440: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
c450: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
c460: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
c470: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
c480: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
c490: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
c4a0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
c4b0: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
c4c0: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
c4d0: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
c4e0: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
c4f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c500: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
c510: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
c520: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
c530: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
c540: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
c550: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
c560: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
c570: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c580: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
c590: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
c5a0: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
c5b0: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
c5c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
c5d0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
c5e0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
c5f0: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
c600: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
c610: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
c620: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
c630: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
c640: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
c650: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
c660: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
c670: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
c680: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
c690: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20  = p->pNext;.#if 
c6a0: 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
c6b0: 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66  OSE_IOERR.    if
c6c0: 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29  ( close(p->fd) )
c6d0: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
c6e0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
c6f0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
c700: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
c710: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
c720: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
c730: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
c740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c750: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c760: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
c770: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
c780: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
c790: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
c7a0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e  te3_free(p);.#en
c7b0: 64 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  dif.  }.  pInode
c7c0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
c7d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
c7e0: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
c7f0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
c800: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
c810: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
c820: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
c830: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
c840: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
c850: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
c860: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
c870: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c880: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
c890: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
c8a0: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
c8b0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
c8c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
c8d0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
c8e0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
c8f0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
c900: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
c910: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
c920: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
c930: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
c940: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
c950: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c960: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
c970: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
c980: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
c990: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
c9a0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
c9b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c9c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
c9d0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
c9e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
c9f0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
ca00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
ca10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
ca20: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
ca30: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
ca40: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
ca50: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
ca60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ca70: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
ca80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ca90: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
caa0: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
cab0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
cac0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
cad0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
cae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
caf0: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
cb00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
cb10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
cb20: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
cb30: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
cb40: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
cb50: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
cb60: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
cb70: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
cb80: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
cb90: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
cba0: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
cbb0: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
cbc0: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
cbd0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
cbe0: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
cbf0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
cc00: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
cc10: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
cc20: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
cc30: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
cc40: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
cc50: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
cc60: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
cc70: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
cc80: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
cc90: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
cca0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
ccb0: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
ccc0: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
ccd0: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
cce0: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
ccf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cd00: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
cd10: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
cd20: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
cd50: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
cd60: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
cd90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
cda0: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
cdb0: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
cdc0: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
cdd0: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
cde0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
cdf0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
ce00: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
ce10: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
ce20: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
ce30: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
ce40: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
ce50: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
ce60: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
ce70: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
ce80: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
ce90: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
cea0: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
ceb0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
cec0: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
ced0: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
cee0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
cef0: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
cf00: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
cf10: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
cf20: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
cf30: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
cf40: 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
cf50: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
cf60: 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56  rno);.#ifdef EOV
cf70: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
cf80: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
cf90: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
cfa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
cfb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
cfc0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
cfd0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
cfe0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
cff0: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
d000: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
d010: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
d020: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
d030: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
d040: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
d050: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
d060: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
d070: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
d080: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
d090: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
d0a0: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
d0b0: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
d0c0: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
d0d0: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
d0e0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
d0f0: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
d100: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
d110: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
d120: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
d130: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
d140: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
d150: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
d160: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
d170: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
d180: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
d190: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
d1a0: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
d1b0: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
d1c0: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
d1d0: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
d1e0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
d1f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
d200: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
d210: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
d220: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
d230: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
d240: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
d250: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
d260: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
d270: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
d280: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
d290: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
d2a0: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
d2b0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
d2c0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
d2d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
d2e0: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
d2f0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
d300: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
d310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d320: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
d330: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
d340: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
d350: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
d360: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
d370: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
d380: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d390: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
d3a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
d3b0: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
d3c0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
d3d0: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
d3e0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
d3f0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
d400: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
d410: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
d420: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
d430: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
d440: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
d450: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
d460: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
d470: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
d480: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
d490: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
d4a0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
d4b0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
d4c0: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
d4d0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
d4e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
d4f0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  c( sizeof(*pInod
d500: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
d510: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
d520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d530: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
d540: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
d550: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
d560: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
d570: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
d580: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
d590: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
d5a0: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
d5b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
d5c0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
d5d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
d5e0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
d5f0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
d600: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
d610: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
d620: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
d630: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
d640: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
d650: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
d660: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
d670: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
d680: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d690: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
d6a0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
d6b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
d6c0: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
d6d0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
d6e0: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
d6f0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
d700: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
d710: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
d720: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
d730: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
d740: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
d750: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
d760: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
d770: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
d780: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
d790: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
d7a0: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
d7b0: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
d7c0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
d7d0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
d7e0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
d7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d800: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
d810: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
d820: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
d830: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
d840: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
d850: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
d860: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
d870: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
d880: 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78   pFile );.  unix
d890: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
d8a0: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
d8b0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
d8c0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
d8d0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
d8e0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
d8f0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
d900: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
d910: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
d920: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
d930: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
d940: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
d950: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
d960: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
d970: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
d980: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
d990: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
d9a0: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
d9b0: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
d9c0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
d9d0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
d9e0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
d9f0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
da00: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
da10: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
da20: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
da30: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
da40: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
da50: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
da60: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
da70: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
da80: 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  ) ){.#if OSLOCKI
da90: 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
daa0: 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ERR.      int tE
dab0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dac0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
dad0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
dae0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
daf0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
db00: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
db10: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
db20: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
db30: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
db40: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
db50: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
db60: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
db70: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
db80: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
db90: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
dba0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
dbb0: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
dbc0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
dbd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
dbe0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
dbf0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
dc00: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
dc10: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
dc20: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
dc30: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
dc40: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
dc50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
dc60: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
dc70: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
dc80: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
dc90: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
dca0: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
dcb0: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
dcc0: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
dcd0: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
dce0: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
dcf0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
dd00: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
dd10: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
dd20: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
dd30: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
dd40: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
dd50: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
dd60: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
dd70: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
dd80: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
dd90: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
dda0: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
ddb0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
ddc0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
ddd0: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
dde0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
ddf0: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
de00: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
de10: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
de20: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
de30: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
de40: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
de50: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
de60: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
de70: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
de80: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
de90: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
dea0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
deb0: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
dec0: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
ded0: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
dee0: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
def0: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
df00: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
df10: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
df20: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
df30: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
df40: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
df50: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
df60: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
df70: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
df80: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
df90: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
dfa0: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
dfb0: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
dfc0: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
dfd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dfe0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
dff0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
e000: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
e010: 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  k, int nRetry){.
e020: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
e030: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e040: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e050: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
e060: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
e070: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e080: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70  !=0 );.  if( ((p
e090: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
e0a0: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
e0b0: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
e0c0: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
e0d0: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
e0e0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
e0f0: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
e100: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
e110: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
e120: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
e130: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
e140: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
e150: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
e160: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
e170: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
e180: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e190: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e1a0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
e1b0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
e1c0: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
e1d0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
e1e0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
e1f0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
e200: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
e210: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
e220: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
e230: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
e240: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
e250: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
e260: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e270: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
e280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
e290: 20 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   i = 0;         
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
e2b0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
e2c0: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
e2d0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
e2e0: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
e2f0: 63 20 26 26 20 6e 52 65 74 72 79 20 29 7b 0a 20  c && nRetry ){. 
e300: 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
e310: 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20  00 * (++i));.   
e320: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
e330: 20 21 72 63 20 26 26 20 6e 52 65 74 72 79 2d 2d   !rc && nRetry--
e340: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
e350: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
e360: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
e370: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
e380: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
e390: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
e3a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
e3b0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
e3c0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
e3d0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
e3e0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
e3f0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
e400: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
e410: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
e420: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
e430: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
e440: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
e450: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
e460: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
e470: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
e480: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
e490: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
e4a0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
e4b0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
e4c0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
e4d0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
e4e0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
e4f0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
e500: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
e510: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
e520: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
e530: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
e540: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
e550: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
e560: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
e570: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
e580: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
e590: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
e5a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
e5b0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
e5c0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
e5d0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
e5e0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
e5f0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
e600: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
e610: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
e620: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
e630: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
e640: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
e650: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
e660: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
e670: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
e680: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
e690: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e6a0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
e6b0: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
e6c0: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
e6d0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
e6e0: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
e6f0: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
e700: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
e710: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
e720: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
e730: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
e740: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
e750: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
e760: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
e770: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
e780: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
e790: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
e7a0: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
e7b0: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
e7c0: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
e7d0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
e7e0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
e7f0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
e800: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
e810: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
e820: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
e830: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e840: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
e850: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
e860: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
e870: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
e880: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
e890: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
e8a0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
e8b0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
e8c0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
e8d0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
e8e0: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
e8f0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
e900: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
e910: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
e920: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
e930: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
e940: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
e950: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
e960: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
e970: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
e980: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
e990: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
e9a0: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
e9b0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
e9c0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
e9d0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
e9e0: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
e9f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
ea00: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
ea10: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
ea20: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
ea30: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
ea40: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
ea50: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
ea60: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
ea70: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
ea80: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
ea90: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
eaa0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
eab0: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
eac0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
ead0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
eae0: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
eaf0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
eb00: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
eb10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
eb20: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
eb30: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
eb40: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
eb50: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
eb60: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
eb70: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
eb80: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
eb90: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
eba0: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
ebb0: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
ebc0: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
ebd0: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
ebe0: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
ebf0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
ec00: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
ec10: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
ec20: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
ec30: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
ec40: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
ec50: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
ec60: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
ec70: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
ec80: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
ec90: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
eca0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
ecb0: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
ecc0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
ecd0: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
ece0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
ecf0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
ed00: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
ed10: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
ed20: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
ed30: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
ed40: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
ed50: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
ed60: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
ed70: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
ed80: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
ed90: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
eda0: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
edb0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
edc0: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
edd0: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
ede0: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
edf0: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
ee00: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
ee10: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
ee20: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
ee30: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
ee40: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
ee50: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
ee60: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
ee70: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
ee80: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
ee90: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
eea0: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
eeb0: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
eec0: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
eed0: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
eee0: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
eef0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ef00: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
ef10: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ef20: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
ef30: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
ef40: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
ef50: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
ef60: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
ef70: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
ef80: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
ef90: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
efa0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
efb0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
efc0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
efd0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
efe0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
eff0: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
f000: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
f010: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
f020: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
f030: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
f040: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
f050: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
f060: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
f070: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
f080: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
f090: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
f0a0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
f0b0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
f0c0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
f0d0: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
f0e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
f0f0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
f100: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
f110: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
f120: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
f130: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
f140: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
f150: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
f160: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
f170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
f180: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
f190: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
f1a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f1b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
f1c0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
f1d0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
f1e0: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
f1f0: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
f200: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
f210: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
f220: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
f230: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
f240: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
f250: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
f260: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
f270: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
f280: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
f290: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
f2a0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
f2b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
f2c0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
f2d0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
f2e0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
f2f0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
f300: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
f310: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
f320: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
f330: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
f340: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f350: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
f360: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
f370: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
f380: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
f390: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
f3a0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
f3b0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
f3c0: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
f3d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
f3e0: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
f3f0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
f400: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
f410: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
f420: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
f430: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
f440: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
f450: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
f460: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
f470: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
f480: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
f490: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
f4a0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
f4b0: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
f4c0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
f4d0: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
f4e0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f4f0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
f500: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
f510: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
f520: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
f530: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
f540: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
f550: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
f560: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
f570: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
f580: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
f590: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
f5a0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
f5b0: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
f5c0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f5d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
f5e0: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
f5f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
f600: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
f610: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
f620: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
f630: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
f640: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f650: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f660: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f670: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
f680: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
f690: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
f6a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
f6b0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f6c0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
f6d0: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
f6e0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
f6f0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
f700: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
f710: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
f720: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
f730: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
f740: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
f750: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
f760: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
f770: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
f780: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
f790: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
f7a0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
f7b0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
f7c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f7d0: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
f7e0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
f7f0: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
f800: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
f810: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
f820: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
f830: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
f840: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
f850: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
f860: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
f870: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
f880: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f890: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
f8a0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f8b0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
f8c0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72   0) ){.      tEr
f8d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f8f0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f900: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f910: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
f920: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f930: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
f940: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f950: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f960: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
f970: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
f980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
f990: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
f9a0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
f9b0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
f9c0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
f9d0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
f9e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
f9f0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
fa00: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
fa10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fa20: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
fa30: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
fa40: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
fa50: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
fa60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
fa70: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
fa80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
fa90: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
faa0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
fab0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
fac0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
fad0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
fae0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
faf0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fb00: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
fb10: 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  0) ){.      tErr
fb20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
fb30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
fb40: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
fb50: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
fb60: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
fb70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
fb80: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
fb90: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
fba0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
fbb0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
fbc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
fbd0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
fbe0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
fbf0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fc00: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
fc10: 2c 20 31 30 29 20 26 26 20 72 63 3d 3d 53 51 4c  , 10) && rc==SQL
fc20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fc30: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
fc40: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
fc50: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
fc60: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
fc70: 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  o;.#if OSLOCKING
fc80: 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
fc90: 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  R.      rc = sql
fca0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
fcb0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
fcc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
fcd0: 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20  CK); .#else.    
fce0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fcf0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e  ERR_UNLOCK; .#en
fd00: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
fd10: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
fd20: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fd30: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
fd40: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
fd50: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
fd60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
fd70: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
fd80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
fd90: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
fda0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
fdb0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
fdc0: 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
fdd0: 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
fde0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
fdf0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
fe00: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
fe10: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
fe20: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
fe30: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
fe40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
fe50: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
fe60: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
fe70: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
fe80: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
fe90: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
fea0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
feb0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
fec0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
fed0: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
fee0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
fef0: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
ff00: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
ff10: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
ff20: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
ff30: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
ff40: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
ff50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
ff60: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
ff70: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c  ileLock );.    l
ff80: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
ff90: 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72  RLCK;..    asser
ffa0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  t( eFileLock==RE
ffb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
ffc0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
ffd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
ffe0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  if( eFileLock==R
fff0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
10000 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10010 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
10020 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  TE;.      lock.l
10030 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d  _len = 1L;.    }
10040 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  else{.      lock
10050 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
10060 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
10070 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10080 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a  ED_SIZE;.    }..
10090 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
100a0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
100b0 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74  k, 0) ){.      t
100c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
100d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
100e0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
100f0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10100 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
10110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10120 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
10130 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
10140 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
10150 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
10160 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
10170 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10180 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
10190 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
101a0 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
101b0 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
101c0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
101d0 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
101e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
101f0 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
10200 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
10210 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
10220 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10230 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
10240 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
10250 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
10260 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
10270 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
10280 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
10290 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
102a0 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
102b0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
102c0 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
102d0 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
102e0 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
102f0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
10300 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
10310 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
10320 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
10330 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
10350 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10360 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
10370 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
10380 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
10390 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
103a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
103b0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
103c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
103d0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
103e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
103f0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
10400 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
10410 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
10420 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
10430 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
10440 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
10450 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
10460 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
10470 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
10480 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
10490 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
104a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
104b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
104c0 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
104d0 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
104e0 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
104f0 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
10500 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
10510 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
10520 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
10530 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
10540 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
10550 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
10560 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
10570 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  pFile->pUnused;.
10580 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
10590 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
105a0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
105b0 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
105c0 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
105d0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
105e0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
105f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
10600 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10610 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
10620 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
10630 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
10640 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
10650 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
10660 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
10670 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
10680 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
10690 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
106a0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
106b0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
106c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
106d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
106e0 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
106f0 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
10700 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
10710 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
10720 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
10730 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
10740 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
10750 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
10760 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
10770 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
10780 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
10790 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
107a0 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
107b0 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
107c0 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
107d0 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
107e0 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
107f0 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
10800 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
10810 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
10820 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
10830 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
10840 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
10850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10860 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
10870 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
10880 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
10890 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
108a0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
108b0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
108c0 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
108d0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
108e0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
108f0 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
10900 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
10910 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10920 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
10930 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
10940 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
10950 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
10960 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
10970 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10980 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
10990 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
109a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
109b0 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
109c0 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
109d0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
109e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
109f0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
10a00 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
10a10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
10a30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
10a40 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
10a50 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
10a60 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
10a70 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
10a80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10a90 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
10aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10ab0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
10ac0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10ad0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
10ae0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
10af0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
10b00 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
10b10 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
10b20 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
10b30 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
10b40 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
10b50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
10b60 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
10b70 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
10b80 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
10b90 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
10ba0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
10bb0 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
10bc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10bd0 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
10be0 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
10bf0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
10c00 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
10c10 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
10c20 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
10c30 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
10c40 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
10c50 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
10c60 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
10c70 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
10c80 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
10c90 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
10ca0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
10cb0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
10cc0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
10cd0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
10ce0 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
10cf0 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
10d00 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
10d10 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
10d20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
10d30 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
10d40 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
10d50 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
10d60 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
10d70 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
10d80 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
10d90 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
10da0 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
10db0 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
10dc0 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
10dd0 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
10de0 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
10df0 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
10e00 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
10e10 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
10e20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
10e30 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
10e40 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
10e50 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
10e60 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
10e70 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10e80 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
10e90 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
10ea0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
10eb0 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
10ec0 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a  call errors */..
10ed0 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
10ee0 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
10ef0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10f00 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
10f10 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
10f20 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
10f30 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
10f40 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
10f50 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
10f60 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
10f70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10f80 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
10f90 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
10fa0 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
10fb0 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
10fc0 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
10fd0 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
10fe0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
10ff0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
11000 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
11010 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
11020 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
11030 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
11040 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
11050 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11060 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
11070 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11080 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11090 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
110a0 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
110b0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
110c0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
110d0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
110e0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
110f0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11100 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
11110 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
11120 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11130 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
11140 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11150 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
11160 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
11170 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
11180 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
11190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
111a0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
111b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
111c0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
111d0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
111e0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
111f0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
11200 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
11210 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
11220 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11230 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
11240 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
11250 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
11260 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31   &lock, 10)==(-1
11270 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
11280 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
11290 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
112a0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
112b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
112c0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
112d0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
112e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
112f0 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
11300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11310 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23  _IOERR_UNLOCK;.#
11320 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
11330 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11340 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
11350 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
11360 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
11370 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
11380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
11390 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
113a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
113b0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
113c0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
113d0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
113e0 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
113f0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
11400 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
11410 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
11420 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
11430 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
11440 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11450 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11460 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
11470 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
11480 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
11490 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
114a0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
114b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
114c0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
114d0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
114e0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
114f0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
11500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11510 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
11520 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
11530 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11540 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11550 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
11560 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
11570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11580 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
11590 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
115a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
115b0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
115c0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
115d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
115e0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
115f0 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
11600 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
11610 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
11620 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
11630 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
11640 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
11650 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
11660 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
11670 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
11680 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
11690 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
116a0 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20  k, 10) ){.      
116b0 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
116c0 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
116d0 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
116e0 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
116f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11700 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11710 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11720 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _RDLOCK);.#else.
11730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
11740 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
11750 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
11760 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
11770 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
11780 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
11790 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
117a0 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
117b0 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
117c0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
117d0 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
117e0 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
117f0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
11800 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
11810 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
11820 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
11830 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
11840 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
11850 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
11860 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
11870 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
11880 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
11890 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
118a0 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
118b0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
118c0 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
118d0 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
118e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
118f0 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
11900 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
11910 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
11920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
11930 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11940 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11950 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11960 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11970 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
11980 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
11990 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
119a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
119b0 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
119c0 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
119d0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
119e0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
119f0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11a00 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
11a10 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
11a20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
11a30 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
11a40 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
11a50 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
11a60 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
11a70 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   10)==0 ){.     
11a80 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
11a90 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
11ab0 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
11ac0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
11ad0 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
11ae0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11af0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11b00 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11b10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11b20 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
11b30 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11b40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
11b50 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11b60 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
11b70 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72   }.#else.      r
11b80 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11b90 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
11ba0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
11bb0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
11bc0 64 69 66 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  dif.      goto e
11bd0 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
11be0 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65  .  }.  if( eFile
11bf0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
11c00 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
11c10 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
11c20 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
11c30 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
11c40 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
11c50 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
11c60 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
11c70 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
11c80 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
11c90 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
11ca0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
11cb0 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
11cc0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
11cd0 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
11ce0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
11cf0 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
11d00 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
11d10 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
11d20 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
11d30 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
11d40 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
11d50 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
11d60 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  k, 10)==0 ){.   
11d70 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
11d80 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
11d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
11da0 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
11db0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
11dc0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
11dd0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
11de0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11df0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11e00 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11e10 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
11e20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11e30 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
11e40 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
11e50 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
11e60 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  no);.        }.#
11e70 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
11e80 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11e90 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73  NLOCK;.        s
11ea0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
11eb0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
11ec0 64 69 66 0a 20 20 20 20 20 20 20 20 70 49 6e 6f  dif.        pIno
11ed0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
11ee0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
11ef0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11f00 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
11f10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11f20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
11f30 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
11f40 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
11f50 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
11f60 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
11f70 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
11f80 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
11f90 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
11fa0 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
11fb0 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
11fc0 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
11fd0 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
11fe0 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
11ff0 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
12000 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
12010 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
12020 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
12030 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   ){.      closeP
12040 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
12050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
12060 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
12070 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
12080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12090 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
120a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
120b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
120c0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
120d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
120e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
120f0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12100 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12110 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12120 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12130 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12140 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12150 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12160 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12170 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
12180 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12190 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
121a0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
121b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
121c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
121d0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
121e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
121f0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
12200 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
12210 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a   eFileLock, 0);.
12220 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12230 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
12240 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
12250 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
12260 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
12270 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
12280 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
12290 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
122a0 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
122b0 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
122c0 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
122d0 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
122e0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
122f0 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
12300 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
12310 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
12320 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
12330 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
12340 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
12350 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
12360 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
12370 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
12380 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
12390 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
123a0 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
123b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
123c0 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
123d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
123e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
123f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12400 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48  ;.#if OSCLOSE_CH
12410 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a  ECK_CLOSE_IOERR.
12420 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
12430 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  0 ){.    int err
12440 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
12450 68 29 3b 0a 20 20 20 20 69 66 28 20 65 72 72 20  h);.    if( err 
12460 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
12470 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
12480 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
12490 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
124a0 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 65 6c 73  _CLOSE;.    }els
124b0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
124c0 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  h=-1;.    }.  }.
124d0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 46 69 6c  #else.  if( pFil
124e0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
124f0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
12500 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
12510 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
12520 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
12530 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
12540 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
12550 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
12560 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
12570 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
12580 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
12590 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
125a0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
125b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
125c0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
125d0 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
125e0 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
125f0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
12600 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
12610 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
12620 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
12630 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
12640 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
12650 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
12660 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
12670 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
12680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12690 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
126a0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
126b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
126c0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
126d0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
126e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
126f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12700 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
12710 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
12720 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
12730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
12740 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
12750 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
12760 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
12770 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
12780 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
12790 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
127a0 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
127b0 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
127c0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
127d0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
127e0 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
127f0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
12800 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
12810 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
12820 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
12830 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
12840 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
12850 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
12860 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
12870 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
12880 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
12890 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
128a0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
128b0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
128c0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
128d0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
128e0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
128f0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
12900 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
12910 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
12920 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
12930 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
12940 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
12950 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
12960 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
12970 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
12980 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
12990 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
129a0 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
129b0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
129c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
129d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
129e0 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
129f0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
12a00 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
12a10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
12ae0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
12af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b00 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
12b10 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
12b20 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
12b30 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
12b40 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
12b50 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
12b60 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
12b70 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
12b80 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
12b90 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
12ba0 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
12bb0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
12bc0 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
12bd0 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
12be0 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
12bf0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
12c00 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
12c10 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
12c20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
12c30 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
12c40 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
12c50 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
12c60 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
12c70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
12c80 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
12c90 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
12ca0 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
12cb0 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
12cc0 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
12cd0 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
12ce0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
12cf0 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
12d00 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
12d10 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
12d20 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
12d30 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
12d40 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
12d50 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
12d60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12d70 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
12d80 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
12d90 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
12da0 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
12db0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
12dc0 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
12dd0 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
12de0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
12df0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
12e00 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12e10 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
12e20 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
12e30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
12e50 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
12e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12e70 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
12e80 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
12e90 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
12ea0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
12eb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
12ec0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
12ed0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
12ee0 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
12ef0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
12f00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12f10 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
12f20 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
12f30 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
12f40 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
12f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12f60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
12f70 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
12f80 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
12f90 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
12fa0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
12fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12fc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12fd0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
12fe0 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  )id;.  unixEnter
12ff0 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 2f 2a  Mutex();.  .  /*
13000 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
13010 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
13020 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
13030 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
13040 6f 73 65 0a 20 20 20 2a 2a 20 72 6f 75 74 69 6e  ose.   ** routin
13050 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
13060 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
13070 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
13080 20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20     */.  assert( 
13090 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
130a0 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d  Lock>0 || pFile-
130b0 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
130c0 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66  sLock==0 );.  if
130d0 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e  ( ALWAYS(pFile->
130e0 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65  pInode) && pFile
130f0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
13100 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
13110 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13120 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
13130 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
13140 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
13150 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
13160 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
13170 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
13180 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
13190 65 20 66 69 6c 65 0a 20 20 20 20 20 2a 2a 20 64  e file.     ** d
131a0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
131b0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
131c0 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
131d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
131e0 73 65 64 20 0a 20 20 20 20 20 2a 2a 20 77 68 65  sed .     ** whe
131f0 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
13200 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
13210 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
13220 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
13230 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
13240 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
13250 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13260 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
13270 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
13280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
13290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
132a0 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
132b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
132c0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
132d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
132e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13320 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
13330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13390 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
133a0 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
133b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
133d0 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
133e0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
133f0 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
13400 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
13410 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
13420 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63   (really a direc
13430 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c  tory) to control
13440 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
13450 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
13460 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20  orks.** on just 
13470 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
13480 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
13490 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
134a0 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
134b0 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
134c0 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
134d0 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
134e0 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
134f0 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
13500 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
13510 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
13520 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
13530 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13540 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
13550 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
13560 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
13570 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
13580 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
13590 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
135a0 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
135b0 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
135c0 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
135d0 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
135e0 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
135f0 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
13600 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
13610 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
13620 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
13630 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
13640 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
13650 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
13660 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20 69  a subdirectory i
13670 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
13680 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64  tory as.** the d
13690 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
136a0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
136b0 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
136c0 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
136d0 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
136e0 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69  nce of a lock di
136f0 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20  rectory implies 
13700 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
13710 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a  k.  All other.**
13720 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41   lock types (SHA
13730 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50  RED, RESERVED, P
13740 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70  ENDING) are mapp
13750 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56  ed into EXCLUSIV
13760 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  E..*/../*.** The
13770 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64   file suffix add
13780 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62  ed to the data b
13790 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  ase filename in 
137a0 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
137b0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65  the.** lock dire
137c0 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ctory..*/.#defin
137d0 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
137e0 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20   ".lock"../*.** 
137f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13800 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13810 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13820 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13830 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13840 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13850 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13860 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13870 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13880 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13890 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
138a0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
138b0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
138c0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
138d0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
138e0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
138f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13900 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13910 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f  ing..**.** In do
13920 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65  tfile locking, e
13930 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69  ither a lock exi
13940 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e  sts or it does n
13950 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a  ot.  So in this.
13960 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20  ** variation of 
13970 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13980 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73  k(), *pResOut is
13990 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
139a0 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68  any lock.** is h
139b0 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  eld on the file 
139c0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
139d0 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
139e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
139f0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
13a00 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13a10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13a20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13a30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13a40 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13a50 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13a60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13a70 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13a80 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13a90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13aa0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13ab0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13ac0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13ad0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13ae0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13af0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13b00 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13b10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13b20 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13b30 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
13b40 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
13b50 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
13b60 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
13b70 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
13b80 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
13b90 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
13ba0 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
13bb0 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
13bc0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
13bd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
13be0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
13bf0 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
13c00 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
13c10 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
13c20 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
13c30 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
13c40 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
13c50 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
13c60 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b  = osAccess(zLock
13c70 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d  File, 0)==0;.  }
13c80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
13c90 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
13ca0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
13cb0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
13cc0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
13cd0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
13ce0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13cf0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
13d00 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
13d10 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
13d20 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
13d30 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
13d40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
13d50 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
13d60 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
13d70 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
13d80 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
13d90 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
13da0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
13db0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
13dc0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
13dd0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
13de0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
13df0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
13e00 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
13e10 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
13e20 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
13e30 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
13e40 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
13e50 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
13e60 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
13e70 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
13e80 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
13e90 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
13ea0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
13eb0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
13ec0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
13ed0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
13ee0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
13ef0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
13f00 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
13f10 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
13f20 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13f30 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
13f40 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
13f50 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13f60 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
13f70 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13f80 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13f90 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
13fa0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
13fb0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13fc0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13fd0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
13fe0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
13ff0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14000 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14010 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
14020 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
14030 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
14040 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
14050 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
14060 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
14070 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
14080 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
14090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
140a0 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
140b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
140c0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
140d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
140e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
140f0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
14100 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
14110 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
14120 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  xt;.  int rc = S
14130 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
14140 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   If we have any 
14150 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c  lock, then the l
14160 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
14170 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65   exists.  All we
14180 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
14190 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69   is adjust our i
141a0 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
141b0 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c  f the lock level
141c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
141d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
141e0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
141f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14200 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
14210 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
14220 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
14230 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
14240 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  */.#ifdef HAVE_U
14250 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a  TIME.    utime(z
14260 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
14270 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65  .#else.    utime
14280 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
14290 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
142a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
142b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
142c0 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
142d0 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73  ock */.  rc = os
142e0 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c  Mkdir(zLockFile,
142f0 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63   0777);.  if( rc
14300 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69  <0 ){.    /* fai
14310 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
14320 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65  te the lock dire
14330 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74  ctory */.    int
14340 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14350 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
14360 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
14370 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14380 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
14390 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
143a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
143b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
143c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
143d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
143e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
143f0 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
14400 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14410 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
14420 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14430 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  n rc;.  } .  .  
14440 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
14450 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
14460 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
14470 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14480 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
14490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
144a0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
144b0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
144c0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
144d0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
144e0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
144f0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
14500 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
14510 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
14520 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
14530 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
14540 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
14550 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
14560 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
14570 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
14580 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14590 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
145a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
145b0 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
145c0 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
145d0 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
145e0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
145f0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
14600 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14610 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14620 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14630 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
14640 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
14650 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
14660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
14670 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
14680 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14690 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
146a0 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
146b0 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
146c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
146d0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
146e0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
146f0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
14700 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
14710 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
14720 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
14730 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
14740 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14750 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
14760 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
14770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14780 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
14790 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
147a0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
147b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
147c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
147d0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
147e0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
147f0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
14800 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
14810 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
14820 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
14830 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
14840 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
14850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14860 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
14870 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
14880 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
14890 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
148a0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
148b0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
148c0 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
148d0 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
148e0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
148f0 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
14900 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
14910 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
14920 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
14930 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
14940 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
14950 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
14960 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  ){.#if OSLOCKING
14970 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
14980 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  R.      rc = sql
14990 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
149a0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
149b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
149c0 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
149d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
149e0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
149f0 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  f.    }.    if( 
14a00 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14a10 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
14a20 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14a30 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
14a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
14a50 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
14a60 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
14a70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14a80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14a90 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61  lose a file.  Ma
14aa0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
14ab0 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73   has been releas
14ac0 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  ed before closin
14ad0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
14ae0 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71   dotlockClose(sq
14af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
14b00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
14b10 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
14b20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14b30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
14b40 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69   dotlockUnlock(i
14b50 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
14b60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
14b70 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
14b80 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ext);.  }.  rc =
14b90 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
14ba0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
14bb0 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
14bc0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
14bd0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20  e dot-file lock 
14be0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
14bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c50 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ca0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
14cc0 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69  egin flock Locki
14cd0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cf0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ***.**.** Use th
14d00 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d  e flock() system
14d10 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65   call to do file
14d20 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   locking..**.** 
14d30 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
14d40 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65  is like dot-file
14d50 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74   locking in that
14d60 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
14d70 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69  fine-grain locki
14d80 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72  ng levels suppor
14d90 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72  ted by SQLite ar
14da0 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f  e collapsed into
14db0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63  .** a single exc
14dc0 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e  lusive lock.  In
14dd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48   other words, SH
14de0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
14df0 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c  and.** PENDING l
14e00 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d  ocks are the sam
14e10 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58  e thing as an EX
14e20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53  CLUSIVE lock.  S
14e30 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77  QLite.** still w
14e40 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f  orks when you do
14e50 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75   this, but concu
14e60 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65  rrency is reduce
14e70 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20  d since.** only 
14e80 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
14e90 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
14ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
14eb0 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d  a time..**.** Om
14ec0 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  it this section 
14ed0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
14ee0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69  _LOCKING_STYLE i
14ef0 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  s turned off or 
14f00 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20  if.** compiling 
14f10 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a  for VXWORKS..*/.
14f20 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
14f30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
14f40 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  && !OS_VXWORKS..
14f50 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
14f60 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
14f70 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
14f80 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
14f90 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
14fa0 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
14fb0 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
14fc0 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
14fd0 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
14fe0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
14ff0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
15000 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
15010 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
15020 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
15030 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
15040 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
15050 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
15060 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
15070 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
15080 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
15090 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
150a0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
150b0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
150c0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
150d0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
150e0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
150f0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15100 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15110 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15120 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15130 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
15140 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
15150 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
15160 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
15170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
15180 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
15190 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
151a0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
151b0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
151c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
151d0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
151e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
151f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15200 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
15210 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
15220 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
15230 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15240 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15250 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
15260 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
15270 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
15280 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
15290 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
152a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
152b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
152c0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
152d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
152e0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
152f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
15300 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
15310 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
15320 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
15330 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
15340 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
15350 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
15360 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
15370 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
15380 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
15390 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
153a0 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
153b0 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
153c0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
153d0 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
153e0 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
153f0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
15400 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
15410 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
15420 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
15430 20 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e   */.#if OSLOCKIN
15440 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
15450 52 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  RR.        lrc =
15460 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15470 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15480 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15490 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a  UNLOCK);.#else .
154a0 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
154b0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
154c0 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K; .#endif.     
154d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
154e0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
154f0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
15500 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
15510 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
15520 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
15530 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15540 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
15550 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
15560 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
15570 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
15580 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
15590 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
155a0 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
155b0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
155c0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
155d0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
155e0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
155f0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15600 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
15610 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
15620 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
15630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
15640 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15650 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
15660 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15670 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
15680 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
15690 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
156a0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
156b0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
156c0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
156d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
156e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
156f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15700 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
15710 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
15720 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
15730 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
15740 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
15750 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
15760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15770 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
15780 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
15790 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
157a0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
157b0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
157c0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
157d0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
157e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
157f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
15800 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
15810 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
15820 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
15830 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
15840 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
15850 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
15860 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
15870 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
15880 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
15890 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
158a0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
158b0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
158c0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
158d0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
158e0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
158f0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
15900 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
15910 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
15920 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
15930 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
15940 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
15950 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
15960 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
15970 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
15980 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
15990 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
159a0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
159b0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
159c0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
159d0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
159e0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
159f0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
15a00 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
15a10 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
15a20 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
15a30 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
15a40 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
15a50 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
15a60 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
15a70 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
15a80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
15a90 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
15aa0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
15ab0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
15ac0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
15ad0 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
15ae0 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
15af0 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
15b00 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
15b10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b20 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
15b30 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
15b40 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
15b50 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
15b60 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
15b70 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
15b80 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
15b90 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15ba0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
15bb0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
15bc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
15bd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15be0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15bf0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15c00 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
15c10 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
15c20 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
15c30 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
15c40 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
15c50 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
15c60 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
15c70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15c80 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
15c90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15ca0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
15cb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15cc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
15cd0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
15ce0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
15cf0 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
15d00 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
15d10 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
15d20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
15d30 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
15d40 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
15d50 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
15d60 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15d70 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15d80 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15d90 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
15da0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15db0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
15dc0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
15dd0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
15de0 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
15df0 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
15e00 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
15e10 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
15e20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15e30 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15e40 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
15e50 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
15e60 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
15e70 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
15e80 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
15e90 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
15ea0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
15eb0 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
15ec0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
15ed0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15ee0 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
15ef0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
15f00 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
15f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15f20 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
15f30 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
15f40 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
15f50 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
15f60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
15f70 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
15f80 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
15f90 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
15fa0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
15fb0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
15fc0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
15fd0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
15fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
15ff0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
16000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16010 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
16020 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
16030 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
16040 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
16050 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16060 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
16070 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
16080 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16090 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
160a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
160b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
160c0 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
160d0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
160e0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
160f0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
16100 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
16110 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
16120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
16140 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
16150 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
16160 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16170 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
16180 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
16190 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
161a0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
161b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
161c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
161d0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
161e0 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
161f0 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
16200 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
16210 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
16220 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
16230 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
16240 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
16250 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
16260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
16270 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
16280 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
16290 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
162a0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
162b0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
162c0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
162d0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
162e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162f0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
16300 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
16310 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
16320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16330 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
16340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
16350 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
16360 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
16370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
16390 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
163a0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
163b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
163c0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
163d0 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
163e0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
163f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
16400 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
16410 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
16420 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
16430 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
16440 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
16450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
16460 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
16470 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
16480 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
16490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
164a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
164e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
164f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16550 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
16560 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
16570 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
16580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
16590 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
165a0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
165b0 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
165c0 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
165d0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
165e0 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
165f0 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
16600 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
16610 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
16620 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
16630 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
16640 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
16650 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
16660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
16670 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
16680 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
16690 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
166a0 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
166b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
166c0 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
166d0 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
166e0 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
166f0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
16700 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
16710 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
16720 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
16730 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
16740 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
16750 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
16760 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
16770 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
16780 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
16790 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
167a0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
167b0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
167c0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
167d0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
167e0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
167f0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
16800 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
16810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
16820 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
16830 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16840 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
16850 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
16860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16870 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
16880 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16890 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
168a0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
168b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
168c0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
168d0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
168e0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
168f0 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
16900 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
16910 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
16920 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
16930 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
16940 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
16950 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
16960 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
16970 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
16980 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
16990 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
169a0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
169b0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
169c0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
169d0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
169e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
169f0 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
16a00 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
16a10 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
16a20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
16a30 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
16a40 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
16a50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16a60 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16a70 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16a80 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16a90 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
16aa0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
16ab0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
16ac0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
16ad0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16ae0 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
16af0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
16b00 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
16b10 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
16b20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
16b30 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
16b40 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
16b50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
16b60 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
16b70 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
16b80 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
16b90 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
16ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
16bb0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
16bc0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
16bd0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
16be0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
16bf0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
16c00 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
16c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16c20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
16c30 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
16c40 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
16c50 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
16c60 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
16c70 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16c80 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
16c90 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
16ca0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
16cb0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
16cc0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
16cd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
16ce0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
16cf0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
16d00 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
16d10 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
16d20 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
16d30 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
16d40 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
16d50 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
16d60 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
16d70 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
16d80 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
16d90 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
16da0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
16db0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
16dc0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
16dd0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
16de0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
16df0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
16e00 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
16e10 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
16e20 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
16e30 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
16e40 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
16e50 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
16e60 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
16e70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
16e80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
16e90 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
16ea0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16eb0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
16ec0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
16ed0 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
16ee0 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
16ef0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
16f00 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
16f10 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
16f20 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
16f30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
16f40 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
16f50 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
16f60 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
16f70 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
16f80 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
16f90 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
16fa0 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
16fb0 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
16fc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16fd0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
16fe0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
16ff0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
17000 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
17010 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
17020 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
17030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
17040 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
17050 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17060 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
17070 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17080 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
17090 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
170a0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
170b0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
170c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
170d0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
170e0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
170f0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
17100 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
17110 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
17120 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
17130 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
17140 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
17150 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
17160 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17170 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
17180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17190 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
171a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
171b0 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
171c0 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
171d0 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
171e0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
171f0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
17200 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
17210 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17220 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
17230 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
17240 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
17250 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
17260 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
17270 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17280 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
17290 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
172a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
172b0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
172c0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
172d0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
172e0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
172f0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17300 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17310 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17330 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17340 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17350 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
17360 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
17370 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17380 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
17390 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
173a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
173b0 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
173c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
173d0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
173e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
173f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17400 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
17410 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
17420 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
17430 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
17440 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
17450 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17460 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
17470 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
17480 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
17490 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
174a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
174b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
174c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
174d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
174e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
174f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
17500 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17510 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
17520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17530 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
17540 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
17550 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
17560 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
17570 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
17580 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
17590 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
175a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
175b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
175c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
175d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
175e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
175f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
17600 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
17610 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
17620 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
17630 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
17640 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
17650 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
17660 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
17670 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
17680 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
17690 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
176a0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
176b0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
176c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
176d0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
176e0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
176f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17700 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
17710 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
17720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
17730 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
17740 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
17750 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
17760 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17770 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
17780 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
17790 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
177a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
177b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
177c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
177d0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
177e0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
177f0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
17800 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
17810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17820 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
17830 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
17840 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
17850 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
17860 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
17870 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17890 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
178a0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
178b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
178c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
17920 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
17990 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
179c0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
179d0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
179e0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
179f0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
17a00 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
17a10 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
17a20 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
17a30 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
17a40 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
17a50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
17a60 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
17a70 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
17a80 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
17a90 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
17aa0 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
17ab0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17ad0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
17ae0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
17af0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
17b00 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
17b10 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
17b20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
17b30 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
17b40 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
17b50 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
17b60 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
17b70 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
17b80 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
17b90 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
17ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
17bb0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
17bc0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
17bd0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
17be0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
17bf0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
17c00 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
17c10 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
17c20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
17c30 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
17c40 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
17c50 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
17c60 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
17c70 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
17c80 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
17c90 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
17ca0 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
17cb0 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
17cc0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
17cd0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
17ce0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
17cf0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
17d00 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
17d10 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
17d20 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
17d30 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
17d40 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
17d70 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
17d80 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
17d90 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
17da0 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
17db0 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
17dc0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
17dd0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
17de0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
17df0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
17e00 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
17e10 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
17e20 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
17e30 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
17e40 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
17e50 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
17e60 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
17e70 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
17e80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
17e90 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
17ea0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
17eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17ec0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
17ed0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
17ee0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
17ef0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
17f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
17f10 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
17f20 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
17f30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
17f40 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
17f50 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
17f60 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
17f70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
17f80 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
17f90 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17fa0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
17fb0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17fd0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
17fe0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
17ff0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
18000 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
18010 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
18020 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
18030 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
18040 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
18050 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
18060 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
18070 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
18080 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
18090 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
180a0 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
180b0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
180c0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
180d0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
180e0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
180f0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
18100 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
18110 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
18120 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
18130 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
18140 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
18150 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
18160 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
18170 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
18180 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
18190 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
181a0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
181b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
181c0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
181d0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
181e0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
181f0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
18200 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
18210 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
18220 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
18230 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
18240 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
18250 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
18260 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
18270 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
18280 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
18290 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
182a0 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
182b0 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
182c0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
182d0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
182e0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
182f0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
18300 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18310 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
18320 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
18330 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
18340 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
18350 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
18360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18370 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
18380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18390 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
183a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
183b0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
183c0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
183d0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
183e0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
183f0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
18400 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
18410 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
18420 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
18430 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
18440 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
18450 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
18460 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
18470 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
18480 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
18490 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
184a0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
184b0 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
184c0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
184d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
184e0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
184f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18500 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
18510 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
18520 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18530 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
18540 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
18550 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
18560 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
18570 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
18580 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
18590 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
185a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
185b0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
185c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
185d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
185e0 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
185f0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
18600 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
18610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18620 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
18630 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
18640 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
18650 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
18660 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
18670 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
18680 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
18690 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
186a0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
186b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
186c0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
186d0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
186e0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
186f0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
18700 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
18710 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
18720 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
18730 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
18740 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
18750 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
18760 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
18770 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
18780 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18790 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
187a0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
187b0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
187c0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
187d0 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
187e0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
187f0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
18800 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
18810 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
18820 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
18830 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
18840 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18850 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18860 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
18870 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
18880 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
18890 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
188a0 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
188b0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
188c0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
188d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
188e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
188f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
18900 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
18910 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
18920 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
18930 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
18940 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
18950 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
18960 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
18970 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
18980 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
18990 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
189a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
189b0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
189c0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
189d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
189e0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
189f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
18a00 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
18a10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
18a20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
18a30 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
18a40 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
18a50 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
18a60 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
18a70 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
18a80 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
18a90 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
18aa0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
18ab0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
18ac0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
18ad0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
18ae0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
18af0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
18b00 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
18b10 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
18b20 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
18b30 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
18b40 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
18b50 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
18b60 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
18b70 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
18b80 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
18b90 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
18ba0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
18bb0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
18bc0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
18bd0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
18be0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
18bf0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
18c00 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
18c10 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
18c20 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
18c30 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
18c40 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
18c50 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
18c60 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
18c70 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
18c80 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
18c90 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
18ca0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
18cb0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
18cc0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
18cd0 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
18ce0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18cf0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
18d00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18d10 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
18d20 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18d30 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
18d40 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
18d50 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
18d60 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
18d70 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
18d80 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
18d90 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
18da0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
18db0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
18dc0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
18dd0 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
18de0 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
18df0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18e00 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
18e10 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
18e20 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
18e30 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
18e40 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
18e50 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
18e60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
18e70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
18e80 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
18e90 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
18ea0 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
18eb0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
18ec0 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
18ed0 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
18ee0 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
18ef0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61   Don't use the a
18f00 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  fp_end_lock: exi
18f10 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
18f20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18f30 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
18f40 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
18f50 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
18f60 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
18f70 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
18f80 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
18f90 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
18fa0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18fb0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
18fc0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
18fd0 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
18fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18ff0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
19000 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
19010 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
19020 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  ct.  **  (1) We 
19030 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
19040 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
19050 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
19060 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
19070 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
19080 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
19090 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
190a0 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
190b0 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
190c0 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
190d0 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
190e0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
190f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
19100 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19110 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
19120 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19130 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
19140 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
19150 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
19160 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
19170 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
19180 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
19190 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
191a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
191b0 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
191c0 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
191d0 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
191e0 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
191f0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
19200 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
19210 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
19220 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
19230 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
19240 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
19250 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
19260 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
19270 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
19280 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
19290 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
192a0 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
192b0 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
192c0 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
192d0 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
192e0 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
192f0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
19300 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
19310 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
19320 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53     ){.    rc = S
19330 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
19340 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
19350 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  k;.  }.  .  /* I
19360 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
19370 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
19380 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
19390 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
193a0 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
193b0 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
193c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
193d0 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
193e0 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
193f0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
19400 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
19410 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19420 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
19430 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19440 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
19450 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
19460 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
19470 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
19480 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
19490 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
194a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
194b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
194c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
194d0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
194e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
194f0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
19500 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
19510 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
19520 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
19530 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
19540 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
19550 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
19560 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
19570 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
19580 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
19590 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
195a0 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
195b0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
195c0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
195d0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
195e0 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
195f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
19600 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19610 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
19620 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
19630 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
19640 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
19650 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
19660 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
19670 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
19680 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19690 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
196a0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
196b0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
196c0 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
196d0 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
196e0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
196f0 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
19700 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
19710 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
19720 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
19730 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
19740 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
19750 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
19760 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
19770 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
19780 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
19790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
197a0 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63     int lrc1, lrc
197b0 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30  2, lrc1Errno = 0
197c0 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d  ;.    long lk, m
197d0 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73  ask;.    .    as
197e0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
197f0 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
19800 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19810 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
19820 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73          .    mas
19830 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67  k = (sizeof(long
19840 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f  )==8) ? LARGEST_
19850 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66  INT64 : 0x7fffff
19860 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  ff;.    /* Now g
19870 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
19880 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
19890 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74      /* note that
198a0 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
198b0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64  the randomness d
198c0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68  oesn't matter th
198d0 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c  at much */.    l
198e0 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20  k = random(); . 
198f0 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
19900 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61  dByte = (lk & ma
19910 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  sk)%(SHARED_SIZE
19920 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
19930 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
19940 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
19950 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
19960 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
19970 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
19980 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
19990 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
199a0 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63  c1) ){.      lrc
199b0 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e  1Errno = pFile->
199c0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d  lastErrno;.    }
199d0 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
199e0 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
199f0 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
19a00 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc2 = afpSetLock
19a10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19a20 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
19a30 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
19a40 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f    .    if( IS_LO
19a50 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
19a60 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61   {.      storeLa
19a70 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c  stErrno(pFile, l
19a80 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  rc1Errno);.     
19a90 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
19aa0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
19ab0 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
19ac0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
19ad0 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20  R(lrc2) ){.     
19ae0 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20   rc = lrc2;.    
19af0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
19b00 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
19b10 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49  if( lrc1 != SQLI
19b20 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
19b30 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d  rc = lrc1;.    }
19b40 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46   else {.      pF
19b50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
19b60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
19b70 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
19b80 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
19b90 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
19ba0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
19bb0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
19bc0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
19bd0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
19be0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
19bf0 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
19c00 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
19c10 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
19c20 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
19c30 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
19c40 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
19c50 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
19c60 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
19c70 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
19c80 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
19c90 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
19ca0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
19cb0 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
19cc0 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
19cd0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
19ce0 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
19cf0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
19d00 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
19d10 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
19d20 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
19d30 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
19d40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
19d50 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  .    if (eFileLo
19d60 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c  ck >= RESERVED_L
19d70 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
19d80 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56  ileLock < RESERV
19d90 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  ED_LOCK) {.     
19da0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20     /* Acquire a 
19db0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
19dc0 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
19dd0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
19de0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
19df0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
19e00 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20  TE, 1,1);.      
19e10 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20  if( !failed ){. 
19e20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
19e30 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
19e40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19e50 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65  if (!failed && e
19e60 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c  FileLock == EXCL
19e70 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
19e80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
19e90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
19ea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20   */.        .   
19eb0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
19ec0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66   shared lock bef
19ed0 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72  ore trying the r
19ee0 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65  ange.  we'll nee
19ef0 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72  d to .      ** r
19f00 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
19f10 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65  hared lock if we
19f20 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20   can't get the  
19f30 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  afpUnlock.      
19f40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66  */.      if( !(f
19f50 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
19f60 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19f70 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
19f80 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20  D_FIRST +.      
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
19fb0 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b  dByte, 1, 0)) ){
19fc0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69  .        int fai
19fd0 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  led2 = SQLITE_OK
19fe0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77  ;.        /* now
19ff0 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74   attemmpt to get
1a000 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1a010 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ock range */.   
1a020 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
1a030 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a040 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a050 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a080 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a  HARED_SIZE, 1);.
1a090 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c          if( fail
1a0a0 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d  ed && (failed2 =
1a0b0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a0c0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a0d0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
1a0f0 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64  ED_FIRST + pInod
1a100 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
1a110 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 1)) ){.       
1a120 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73     /* Can't rees
1a130 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
1a140 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65  ed lock.  Sqlite
1a150 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69   can't deal, thi
1a160 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  s is.          *
1a170 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f  * a critical I/O
1a180 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1a190 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1a1a0 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51   = ((failed & SQ
1a1b0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
1a1c0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
1a1d0 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
1a1e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a1f0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
1a200 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a210 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
1a220 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
1a230 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
1a240 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
1a250 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
1a260 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
1a270 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
1a280 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
1a290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a2a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1a2b0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
1a2c0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1a2d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
1a2e0 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
1a2f0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
1a300 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
1a310 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1a320 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
1a330 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
1a340 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
1a350 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
1a360 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  p_end_lock:.  un
1a370 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a380 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
1a390 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66      %d %s %s (af
1a3a0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
1a3b0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
1a3c0 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
1a3d0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
1a3e0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1a3f0 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
1a400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
1a410 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
1a420 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
1a430 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
1a440 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
1a450 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
1a460 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
1a470 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
1a480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
1a490 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
1a4a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a4b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
1a4c0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
1a4d0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
1a4e0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
1a4f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a510 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fpUnlock(sqlite3
1a520 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
1a530 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
1a540 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a550 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
1a560 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1a570 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
1a580 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
1a590 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1a5a0 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
1a5b0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1a5c0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
1a5d0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
1a5e0 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a  skipShared = 0;.
1a5f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a600 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69  ST.  int h = pFi
1a610 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  le->h;.#endif.. 
1a620 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1a630 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
1a640 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
1a650 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
1a660 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
1a670 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
1a680 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a690 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
1a6a0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
1a6b0 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
1a6c0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
1a6d0 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64            getpid
1a6e0 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ()));..  assert(
1a6f0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
1a700 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
1a710 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a720 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
1a730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a740 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
1a750 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a760 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
1a770 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
1a780 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a790 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
1a7a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
1a7b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
1a7c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1a7d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
1a7e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
1a7f0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1a800 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1a810 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a820 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
1a830 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a840 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a  Benign(0);.    .
1a850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a860 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
1a870 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
1a880 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
1a890 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
1a8a0 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
1a8b0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1a8c0 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
1a8d0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
1a8e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a8f0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
1a900 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
1a910 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1a920 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
1a930 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1a940 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1a950 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
1a960 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
1a970 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
1a980 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
1a990 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
1a9a0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
1a9b0 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
1a9c0 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
1a9d0 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
1a9e0 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
1a9f0 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
1aa00 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
1aa10 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1aa20 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1aa30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1aa40 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
1aa50 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
1aa60 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1aa70 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
1aa80 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
1aa90 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
1aaa0 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
1aab0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
1aac0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
1aad0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
1aae0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
1aaf0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
1ab00 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1ab10 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1ab20 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
1ab30 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
1ab40 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
1ab50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ab60 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
1ab70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1ab80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
1ab90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1aba0 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
1abb0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
1abc0 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
1abd0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
1abe0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
1abf0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
1ac00 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
1ac10 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
1ac20 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1ac30 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1ac40 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
1ac50 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
1ac60 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
1ac70 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
1ac80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ac90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aca0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
1acb0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
1acc0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
1acd0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1ace0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1acf0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
1ad00 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
1ad10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ad20 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
1ad30 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
1ad40 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
1ad50 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
1ad60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
1ad70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1ad80 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1ad90 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
1ada0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1adb0 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
1adc0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
1add0 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
1ade0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1adf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1ae00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1ae10 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
1ae20 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
1ae30 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
1ae40 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
1ae50 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
1ae60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ae70 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
1ae80 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
1ae90 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1aea0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
1aeb0 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
1aec0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1aed0 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
1aee0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
1aef0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
1af00 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
1af10 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
1af20 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
1af30 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
1af40 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
1af50 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
1af60 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
1af70 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
1af80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
1af90 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
1afa0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
1afb0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1afc0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1afd0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1afe0 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
1aff0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1b000 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1b010 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
1b020 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
1b030 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1b040 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1b050 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
1b060 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
1b070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b080 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
1b090 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
1b0a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
1b0b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
1b0c0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
1b0d0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1b0e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b100 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
1b110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b120 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
1b130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
1b140 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
1b150 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
1b160 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
1b170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b180 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
1b190 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
1b1a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
1b1b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b1c0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
1b1d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b1e0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
1b1f0 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
1b200 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
1b210 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
1b220 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
1b230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1b240 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
1b250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1b260 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
1b270 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b280 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
1b290 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
1b2a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
1b2b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
1b2c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
1b2d0 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
1b2e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
1b2f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1b300 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
1b310 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
1b320 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
1b330 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
1b340 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
1b350 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
1b360 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
1b370 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
1b380 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
1b390 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1b3a0 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1b3b0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1b3c0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1b3d0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
1b3e0 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
1b3f0 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
1b400 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
1b410 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
1b420 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
1b430 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
1b440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b450 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1b460 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
1b470 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
1b480 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
1b490 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
1b4a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
1b4b0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
1b4c0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1b4d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b4e0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
1b4f0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
1b500 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
1b510 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1b520 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
1b530 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
1b540 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
1b550 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
1b560 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
1b570 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
1b580 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
1b590 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
1b5a0 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
1b5b0 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
1b5c0 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
1b5d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
1b5e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1b5f0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
1b600 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
1b610 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1b620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b630 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1b640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b680 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1b690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1b6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
1b6f0 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20  gin NFS Locking 
1b700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b720 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
1b730 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1b740 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b750 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20  NG_STYLE./*. ** 
1b760 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
1b770 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
1b780 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
1b790 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
1b7a0 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75  eFileLock. ** mu
1b7b0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
1b7c0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
1b7d0 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
1b7e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1b7f0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
1b800 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
1b810 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
1b820 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1b830 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
1b840 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b850 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
1b860 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
1b870 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1b880 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
1b890 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
1b8a0 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
1b8b0 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a  ileLock, 1);.}..
1b8c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1b8d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1b8e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1b8f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
1b900 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
1b910 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c  ove is the NFS l
1b920 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1b930 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
1b940 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
1b950 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
1b960 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
1b970 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
1b980 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
1b990 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
1b9a0 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  e.  .**.********
1b9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1b9c0 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63  d of the NFS loc
1b9d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
1b9e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1b9f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1ba00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba40 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
1ba50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1baa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
1bab0 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
1bac0 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
1bad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bae0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
1baf0 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
1bb00 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
1bb10 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
1bb20 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
1bb30 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
1bb40 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
1bb50 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
1bb60 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
1bb70 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
1bb80 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
1bb90 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
1bba0 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
1bbb0 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
1bbc0 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
1bbd0 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
1bbe0 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
1bbf0 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
1bc00 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
1bc10 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
1bc20 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
1bc30 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1bc40 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
1bc50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1bc60 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
1bc70 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
1bc80 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
1bc90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1bca0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
1bcb0 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
1bcc0 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
1bcd0 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
1bce0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
1bcf0 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
1bd00 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
1bd10 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
1bd20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
1bd30 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
1bd40 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
1bd50 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
1bd60 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
1bd70 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
1bd80 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
1bd90 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
1bda0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
1bdb0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
1bdc0 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
1bdd0 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
1bde0 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  681..**.** To av
1bdf0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1be00 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1be10 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68  a failed read th
1be20 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1be30 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1be40 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1be50 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1be60 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
1be70 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
1be80 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
1be90 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
1bea0 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
1beb0 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69  nt prior = 0;.#i
1bec0 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
1bed0 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
1bee0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
1bef0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
1bf00 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
1bf10 5f 53 54 41 52 54 3b 0a 20 20 64 6f 7b 0a 23 69  _START;.  do{.#i
1bf20 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1bf30 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
1bf40 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1bf50 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1bf60 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1bf70 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1bf80 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1bf90 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1bfa0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
1bfb0 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1bfc0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1bfd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1bfe0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1bff0 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
1c000 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1c010 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1c020 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1c030 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
1c040 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
1c050 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
1c060 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
1c070 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
1c080 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1c090 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
1c0a0 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
1c0b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c0c0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1c0d0 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1c0e0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 0);.      }. 
1c0f0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1c100 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
1c110 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
1c120 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
1c130 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e  .    if( got==cn
1c140 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  t ) break;.    i
1c150 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1c160 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
1c170 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63  TR ){ got = 1; c
1c180 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20  ontinue; }.     
1c190 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20   prior = 0;.    
1c1a0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1c1b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
1c1c0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1c1d0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1c1e0 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1c1f0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1c200 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1c210 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1c220 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1c230 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1c240 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1c250 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1c260 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1c270 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1c280 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1c290 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1c2a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1c2b0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1c2c0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1c2d0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1c2e0 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1c2f0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1c300 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1c310 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1c320 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1c330 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1c340 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1c350 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1c360 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1c370 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1c380 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1c390 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1c3a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c3b0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1c3c0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1c3d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1c3e0 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1c3f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c400 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1c410 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1c420 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  id );..  /* If t
1c430 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1c440 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1c450 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1c460 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1c470 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1c480 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1c490 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1c4a0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1c4b0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1c4c0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1c4d0 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1c4e0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1c4f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1c500 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1c510 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1c520 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1c530 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1c540 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1c550 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1c560 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1c570 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1c590 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1c5a0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1c5b0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1c5c0 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1c5d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1c5e0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1c5f0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
1c600 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
1c610 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
1c620 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
1c630 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
1c640 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
1c650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c660 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c670 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
1c680 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1c690 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1c6a0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1c6b0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1c6c0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1c6d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c6e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1c6f0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1c700 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1c710 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1c720 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1c730 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1c740 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1c750 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1c760 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1c780 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1c790 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1c7a0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1c7b0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1c7c0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
1c7d0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
1c7e0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
1c7f0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
1c800 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
1c810 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
1c820 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
1c830 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
1c840 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
1c850 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1c860 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
1c870 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
1c880 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
1c890 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1c8a0 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
1c8b0 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69  t = osPwrite64(i
1c8c0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1c8d0 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28   offset);}while(
1c8e0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
1c8f0 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
1c900 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73   do{.    newOffs
1c910 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1c920 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1c930 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1c940 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
1c950 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
1c960 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
1c970 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
1c980 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
1c990 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
1c9a0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1c9b0 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
1c9c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c9d0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1c9e0 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1c9f0 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  id, 0);.      }.
1ca00 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1ca10 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
1ca20 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20   osWrite(id->h, 
1ca30 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77  pBuf, cnt);.  }w
1ca40 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1ca50 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1ca60 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
1ca70 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
1ca80 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1ca90 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1caa0 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 7d 0a  id, errno);.  }.
1cab0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1cac0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1cad0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
1cae0 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
1caf0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1cb00 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
1cb10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
1cb20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1cb30 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
1cb40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cb50 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
1cb60 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1cb70 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
1cb80 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1cb90 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
1cba0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cbb0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1cbc0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1cbd0 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1cbe0 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
1cbf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1cc00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1cc10 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
1cc20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1cc30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
1cc40 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1cc50 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
1cc60 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1cc70 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
1cc80 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
1cc90 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
1cca0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
1ccb0 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
1ccc0 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
1ccd0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
1cce0 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
1ccf0 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
1cd00 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1cd10 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1cd20 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1cd30 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1cd40 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1cd50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1cd60 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1cd70 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1cd80 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1cd90 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1cda0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1cdb0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1cdc0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1cdd0 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1cde0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1cdf0 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1ce00 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1ce10 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1ce20 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1ce30 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1ce40 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1ce50 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ce60 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1ce70 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1ce80 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1ce90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1cea0 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1ceb0 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1cec0 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1ced0 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1cee0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1cef0 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1cf00 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1cf10 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1cf20 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1cf30 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1cf40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1cf50 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1cf60 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1cf70 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1cf80 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1cf90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1cfa0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1cfb0 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1cfc0 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1cfd0 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1cfe0 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1cff0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1d000 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1d010 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1d020 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1d030 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1d040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1d050 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
1d060 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
1d070 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1d080 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
1d090 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
1d0a0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1d0b0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1d0c0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1d0d0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1d0e0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1d0f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1d100 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1d110 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1d120 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1d130 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1d140 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  );..  if( amt>0 
1d150 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
1d160 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73  <0 && pFile->las
1d170 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29  tErrno!=ENOSPC )
1d180 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45  {.      /* lastE
1d190 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
1d1a0 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
1d1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1c0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1d1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1d1e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1d1f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1d200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d210 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1d220 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1d230 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1d240 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1d250 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1d260 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1d270 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1d280 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1d290 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1d2a0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1d2b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1d2c0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1d2d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1d2e0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1d2f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1d300 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1d310 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1d320 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1d330 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1d340 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1d350 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1d360 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1d370 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1d380 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1d390 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1d3a0 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1d3b0 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1d3c0 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1d3d0 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1d3e0 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1d3f0 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1d400 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
1d410 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1d420 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  c).# define fdat
1d430 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
1d440 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
1d450 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1d460 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
1d470 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1d480 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
1d490 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
1d4a0 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
1d4b0 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
1d4c0 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
1d4d0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
1d4e0 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
1d4f0 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
1d500 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
1d510 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
1d520 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
1d530 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
1d540 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
1d550 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1d560 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55  E_USE_REQUEST_FU
1d570 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74 20  LLFSYNC.#import 
1d580 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70 6f  <notify.h>.#impo
1d590 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74  rt <libkern/OSAt
1d5a0 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69 63 20 4f  omic.h>.static O
1d5b0 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79  SSpinLock notify
1d5c0 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66 69  _lock = 0;.#defi
1d5d0 6e 65 20 52 45 51 55 45 53 54 5f 46 55 4c 4c 53  ne REQUEST_FULLS
1d5e0 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e  YNC_NOTIFICATION
1d5f0 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e 72      "com.apple.r
1d600 65 71 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a 0a  eqsync".#endif..
1d610 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
1d620 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
1d630 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
1d640 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
1d650 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
1d660 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
1d670 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
1d680 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
1d690 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
1d6a0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
1d6b0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
1d6c0 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
1d6d0 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
1d6e0 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
1d6f0 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
1d700 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
1d710 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
1d720 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
1d730 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
1d740 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
1d750 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
1d760 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
1d770 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
1d780 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
1d790 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
1d7a0 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
1d7b0 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
1d7c0 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
1d7d0 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
1d7e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1d7f0 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74  ** SQLite sets t
1d800 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1d810 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
1d820 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68  the file is unch
1d830 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64  anged..** The id
1d840 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e  ea behind dataOn
1d850 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68  ly is that it sh
1d860 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  ould only write 
1d870 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
1d880 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74  .** to disk, not
1d890 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20   the inode.  We 
1d8a0 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c  only set dataOnl
1d8b0 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69  y if the file si
1d8c0 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e  ze is .** unchan
1d8d0 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69  ged since the fi
1d8e0 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20  le size is part 
1d8f0 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48  of the inode.  H
1d900 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20  owever, .** Ted 
1d910 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68  Ts'o tells us th
1d920 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1d930 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  ill also write t
1d940 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a  he inode if the.
1d950 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73  ** file size has
1d960 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f   changed.  The o
1d970 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65  nly real differe
1d980 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74  nce between fdat
1d990 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66  async().** and f
1d9a0 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c  sync(), Ted tell
1d9b0 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64  s us, is that fd
1d9c0 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e  atasync() will n
1d9d0 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20  ot flush the.** 
1d9e0 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69  inode if the mti
1d9f0 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f  me or owner or o
1da00 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69  ther inode attri
1da10 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67  butes have chang
1da20 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63  ed..** We only c
1da30 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69  are about the fi
1da40 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65  le size, not the
1da50 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72   other file attr
1da60 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73  ibutes, so.** as
1da70 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69   far as SQLite i
1da80 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20  s concerned, an 
1da90 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61  fdatasync() is a
1daa0 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a  lways adequate..
1dab0 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73  ** So, we always
1dac0 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29   use fdatasync()
1dad0 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
1dae0 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ble, regardless 
1daf0 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  of.** the value 
1db00 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  of the dataOnly 
1db10 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flag..*/.static 
1db20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
1db30 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
1db40 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
1db50 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
1db60 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1db70 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c  g "ifdef/elif/el
1db80 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74  se/" block has t
1db90 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72  he same structur
1dba0 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e  e as.  ** the on
1dbb0 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72  e below. It is r
1dbc0 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73  eplicated here s
1dbd0 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63  olely to avoid c
1dbe0 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20  luttering .  ** 
1dbf0 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65  up the real code
1dc00 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44   with the UNUSED
1dc10 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
1dc20 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ros..  */.#ifdef
1dc30 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1dc40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1dc50 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
1dc60 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1dc70 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1dc80 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1dc90 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  y);.#elif HAVE_F
1dca0 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45  ULLFSYNC.  UNUSE
1dcb0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1dcc0 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55  Only);.#else.  U
1dcd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1dce0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1dcf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1dd00 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a  taOnly);.#endif.
1dd10 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1dd20 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
1dd30 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
1dd40 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
1dd50 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
1dd60 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
1dd70 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
1dd80 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1dd90 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
1dda0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
1ddb0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
1ddc0 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
1ddd0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1dde0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1ddf0 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
1de00 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
1de10 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1de20 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
1de30 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
1de40 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
1de50 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
1de60 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
1de70 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
1de80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1de90 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
1dea0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41  ITE_OK;.#elif HA
1deb0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
1dec0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23  f( fullSync ){.#
1ded0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
1dee0 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59  _REQUEST_FULLFSY
1def0 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  NC.    rc = osFs
1df00 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20  ync(fd);.    if 
1df10 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53  (!rc) {.      OS
1df20 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f  SpinLockLock(&no
1df30 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20  tify_lock);.    
1df40 20 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f    rc = notify_po
1df50 73 74 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53  st(REQUEST_FULLS
1df60 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e  YNC_NOTIFICATION
1df70 29 3b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c  );.      OSSpinL
1df80 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66  ockUnlock(&notif
1df90 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23  y_lock);.    }.#
1dfa0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73  else.    rc = os
1dfb0 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1dfc0 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69  FSYNC, 0);.#endi
1dfd0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  f.  }else{.    r
1dfe0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1dff0 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1e000 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1e010 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1e020 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1e030 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1e040 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1e050 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1e060 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1e070 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1e080 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1e090 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1e0a0 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1e0b0 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1e0c0 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1e0d0 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1e0e0 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1e0f0 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1e100 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1e110 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1e120 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1e130 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1e140 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1e150 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1e160 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1e170 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1e180 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1e190 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1e1a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1e1b0 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1e1c0 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1e1d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1e1e0 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1e1f0 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1e200 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1e210 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1e220 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1e230 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1e240 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1e250 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1e260 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1e270 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1e280 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1e290 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1e2a0 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1e2b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1e2c0 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1e2d0 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1e2e0 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1e2f0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1e300 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1e310 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1e320 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1e330 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1e340 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1e350 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1e360 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1e370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1e390 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1e3a0 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1e3b0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1e3c0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1e3d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1e3e0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1e3f0 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1e400 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1e410 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e420 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1e430 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1e440 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1e450 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1e460 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1e470 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1e480 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1e490 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1e4a0 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1e4b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1e4c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1e4d0 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1e4e0 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1e4f0 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1e500 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1e510 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1e520 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1e530 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1e540 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1e550 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1e560 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1e570 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1e580 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1e590 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1e5a0 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1e5b0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1e5c0 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1e5d0 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1e5e0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1e5f0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1e600 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1e610 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1e620 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1e630 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1e640 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1e650 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1e660 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1e670 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1e680 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1e690 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1e6a0 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1e6b0 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1e6c0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1e6d0 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1e6e0 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1e6f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1e700 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1e710 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1e720 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1e730 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1e740 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1e750 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1e760 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1e770 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e780 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1e790 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1e7a0 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1e7b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1e7c0 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1e7d0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1e7e0 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1e7f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e800 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1e810 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1e820 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1e830 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1e840 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1e850 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1e860 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1e870 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1e880 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1e890 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1e8a0 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1e8b0 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1e8c0 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1e8d0 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1e8e0 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1e8f0 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1e900 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1e910 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1e920 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1e930 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
1e940 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1e950 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1e960 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1e970 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1e980 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1e990 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1e9a0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1e9b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1e9c0 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1e9d0 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1e9e0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1e9f0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1ea00 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1ea10 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1ea20 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1ea30 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1ea40 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1ea50 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1ea60 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1ea70 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1ea80 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1ea90 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1eaa0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1eab0 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1eac0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1ead0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1eae0 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1eaf0 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1eb00 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1eb10 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1eb20 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1eb30 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1eb40 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1eb50 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1eb60 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1eb70 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1eb80 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1eb90 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1eba0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1ebb0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1ebc0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1ebd0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1ebe0 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1ebf0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1ec00 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1ec10 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1ec20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1ec30 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1ec40 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1ec50 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1ec60 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1ec70 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1ec80 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1ec90 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1eca0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1ecb0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1ecc0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1ecd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1ece0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1ecf0 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1ed00 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1ed10 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1ed20 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1ed30 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1ed40 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1ed50 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1ed60 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1ed70 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1ed80 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1ed90 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1eda0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1edb0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1edc0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1edd0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1ede0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1edf0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1ee00 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1ee10 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1ee20 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1ee30 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1ee40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1ee50 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1ee60 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1ee70 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1ee80 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1ee90 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1eea0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1eeb0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1eec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1eed0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1eee0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1eef0 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1ef00 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1ef10 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1ef20 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1ef30 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1ef40 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1ef50 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1ef60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ef70 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ef80 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1ef90 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1efa0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1efb0 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1efc0 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1efd0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1efe0 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1eff0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1f000 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1f010 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1f020 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1f030 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1f040 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e 63 65  -time occurrance
1f050 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1f060 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1f070 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1f080 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1f090 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1f0a0 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1f0b0 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1f0c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1f0d0 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1f0e0 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1f0f0 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1f100 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1f110 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1f120 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1f130 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1f140 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1f150 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1f160 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1f170 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1f180 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1f190 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1f1a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f1b0 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a   && dirfd>=0 ){.
1f1c0 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1f1d0 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 23  (dirfd, 0, 0);.#
1f1e0 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b  if OSCLOSE_CHECK
1f1f0 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20  _CLOSE_IOERR.   
1f200 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69     if( close(pFi
1f210 6c 65 2d 3e 64 69 72 66 64 29 20 29 7b 0a 20 20  le->dirfd) ){.  
1f220 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1f230 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1f240 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
1f250 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
1f260 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
1f270 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f 62  .#else.      rob
1f280 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1f290 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1f2a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1f2b0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1f2c0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
1f2d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f2e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1f2f0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1f300 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52  &= ~UNIXFILE_DIR
1f310 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65 74  SYNC;..  }.  ret
1f320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f330 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
1f340 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
1f350 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
1f360 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
1f370 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1f380 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
1f390 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
1f3a0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1f3b0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
1f3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1f3d0 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
1f3e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1f3f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1f400 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
1f410 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1f420 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1f430 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1f440 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
1f450 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
1f460 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
1f470 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
1f480 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1f490 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1f4a0 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1f4b0 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1f4c0 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1f4d0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1f4e0 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1f4f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1f500 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1f510 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
1f520 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
1f530 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
1f540 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1f550 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
1f560 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74    rc = robust_ft
1f570 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1f580 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
1f590 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1f5a0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1f5b0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1f5c0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1f5d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1f5e0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1f5f0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1f600 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1f610 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1f620 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1f630 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1f640 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1f650 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1f660 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1f670 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1f680 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1f690 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1f6a0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1f6b0 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1f6c0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1f6d0 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1f6e0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1f6f0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1f700 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1f710 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1f720 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1f730 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1f740 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1f750 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1f760 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1f770 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1f780 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1f790 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1f7a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1f7b0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1f7c0 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1f7d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1f7e0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1f7f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1f800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f810 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1f820 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1f830 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1f840 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1f850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1f860 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1f870 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1f880 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1f890 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1f8a0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1f8b0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1f8c0 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1f8d0 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1f8e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f8f0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1f900 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1f910 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1f920 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1f930 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1f940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f950 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1f960 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1f970 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1f980 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1f990 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1f9a0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1f9b0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1f9c0 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1f9d0 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1f9e0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1f9f0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1fa00 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1fa10 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1fa20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1fa30 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1fa40 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1fa50 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1fa60 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1fa70 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1fa80 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1fa90 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1faa0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1fab0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1fac0 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1fad0 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1fae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1faf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1fb00 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1fb10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1fb20 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1fb30 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1fb40 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1fb50 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1fb60 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1fb70 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1fb80 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1fb90 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1fba0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1fbb0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1fbc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1fbd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fbe0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1fbf0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1fc00 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1fc10 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1fc20 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1fc30 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1fc40 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1fc50 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1fc60 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1fc70 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1fc80 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1fc90 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1fca0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1fcb0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1fcc0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1fcd0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1fce0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1fcf0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1fd00 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1fd10 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1fd20 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1fd40 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1fd50 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1fd60 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1fd70 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1fd80 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1fd90 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1fda0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1fdb0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1fdc0 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  f) ) return SQLI
1fdd0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1fde0 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1fdf0 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1fe00 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1fe10 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1fe20 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1fe30 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1fe40 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1fe50 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1fe60 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1fe70 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1fe80 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1fe90 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1fea0 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1feb0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1fec0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1fed0 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1fee0 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1fef0 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1ff00 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1ff10 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1ff20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1ff30 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1ff40 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1ff50 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1ff60 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1ff70 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1ff80 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1ff90 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1ffa0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1ffb0 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1ffc0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1ffd0 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1ffe0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1fff0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20000 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
20010 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
20020 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
20030 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
20040 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
20050 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
20060 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
20070 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
20080 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
20090 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
200a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
200b0 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
200c0 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
200d0 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
200e0 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
200f0 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
20100 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
20110 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
20120 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
20130 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
20140 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
20150 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
20160 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
20170 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
20180 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
20190 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
201a0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
201b0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
201c0 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
201d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
201e0 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
201f0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
20200 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
20210 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
20220 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
20230 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
20240 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
20250 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  rno);.        re
20260 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
20270 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
20280 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
20290 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
202a0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
202b0 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
202c0 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
202d0 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
202e0 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
202f0 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
20300 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
20310 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
20320 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
20330 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
20340 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
20350 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
20360 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
20370 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
20380 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
20390 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
203a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
203b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 20 28 53 51  _OK;.}...#if (SQ
203c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
203d0 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
203e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
203f0 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
20400 5f 70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63  _private.h".#inc
20410 6c 75 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68  lude <copyfile.h
20420 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  >.static int get
20430 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
20440 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
20450 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
20460 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
20470 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20480 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
20490 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b   int isProxyLock
204a0 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65  ingMode(unixFile
204b0 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   *);.#endif..#if
204c0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
204d0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
204e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
204f0 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
20500 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61  ixTruncateDataba
20510 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69  se(unixFile *, i
20520 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  nt);..static int
20530 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53   unixInvalidateS
20540 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69 78  upportFiles(unix
20550 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  File *, int);..s
20560 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
20570 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 63 6f 6e  eateFileMode(con
20580 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
20590 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f 74 20 2a  mode_t*, uid_t *
205a0 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f 2a 20 6f  ,gid_t *);../* o
205b0 70 65 6e 73 20 61 20 72 65 61 64 2f 77 72 69 74  pens a read/writ
205c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
205d0 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 68  a file zName inh
205e0 65 72 69 74 69 6e 67 20 74 68 65 20 61 70 70 72  eriting the appr
205f0 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73 65 72 2f  opriate.** user/
20600 70 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 64  perms from the d
20610 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
20620 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e  running as root.
20630 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 69    Returns the fi
20640 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
20650 72 20 62 79 20 72 65 66 65 72 65 6e 63 65 0a 2a  r by reference.*
20660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20670 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65 28 0a  xOpenChildFile(.
20680 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
20690 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ame,.  int openF
206a0 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64 62 4f 70  lags,.  int dbOp
206b0 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 70  enFlags,.  int p
206c0 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20  rotFlags,.  int 
206d0 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74 20 66 64  *pFd.){.  int fd
206e0 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65 5f 74 20   = -1;.  mode_t 
206f0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
20700 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
20710 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
20720 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
20730 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20750 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
20760 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 67  ile */.  gid_t g
20770 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
20780 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
20790 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
207a0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  /.  int rc;.  . 
207b0 20 61 73 73 65 72 74 28 70 46 64 21 3d 4e 55 4c   assert(pFd!=NUL
207c0 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 43  L);.  rc = findC
207d0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
207e0 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c 61 67 73  ame, dbOpenFlags
207f0 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
20800 64 2c 20 26 67 69 64 29 3b 0a 20 20 69 66 28 20  d, &gid);.  if( 
20810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20820 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20830 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73    }.  fd = robus
20840 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
20850 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
20860 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
20870 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
20880 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
20890 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
208a0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
208b0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
208c0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
208d0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
208e0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
208f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f  turn rc;.  }.  /
20900 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69  * if we're openi
20910 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f  ng the wal or jo
20920 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e  urnal and runnin
20930 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74 0a 20  g as root, set. 
20940 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
20950 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 69 66 28  uid/gid */.  if(
20960 20 64 62 4f 70 65 6e 46 6c 61 67 73 20 26 20 28   dbOpenFlags & (
20970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
20980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20990 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
209a0 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65   uid_t euid = ge
209b0 74 65 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28  teuid();.    if(
209c0 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69   euid==0 && (eui
209d0 64 21 3d 75 69 64 20 7c 7c 20 67 65 74 65 67 69  d!=uid || getegi
209e0 64 28 29 21 3d 67 69 64 29 20 29 7b 0a 20 20 20  d()!=gid) ){.   
209f0 20 20 20 69 66 28 20 66 63 68 6f 77 6e 28 66 64     if( fchown(fd
20a00 2c 20 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20  , uid, gid) ){. 
20a10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20a20 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
20a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20a40 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
20a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
20a60 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d 20 65 6c  pFd = fd;.  } el
20a70 73 65 20 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  se {.    *pFd = 
20a80 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  -1;.    close(fd
20a90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20aa0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
20ab0 74 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74  t unixReplaceDat
20ac0 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
20ad0 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a  pFile, sqlite3 *
20ae0 73 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74  srcdb) {.  sqlit
20af0 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
20b00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
20b10 69 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53  ile;.  Btree *pS
20b20 72 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a  rcBtree = NULL;.
20b30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20b40 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b  src_file = NULL;
20b50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72  .  unixFile *pSr
20b60 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cFile = NULL;.  
20b70 63 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b  char srcWalPath[
20b80 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
20b90 20 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20   int srcWalFD = 
20ba0 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  -1;.  int rc = S
20bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64  QLITE_OK;.  void
20bc0 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a   *pLock = NULL;.
20bd0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b    int flags = 0;
20be0 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64  .  sqlite3 *srcd
20bf0 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70  b2 = NULL;.  cop
20c00 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b  yfile_state_t s;
20c10 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72  .  int corruptSr
20c20 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  cFileLock = 0;. 
20c30 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46   int corruptDstF
20c40 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
20c50 6e 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20  nt isSrcCorrupt 
20c60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74  = 0;.  int isDst
20c70 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a  Corrupt = 0;.  .
20c80 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
20c90 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64  fetyCheckOk(srcd
20ca0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
20cb0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
20cc0 20 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c    }.    .#if SQL
20cd0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
20ce0 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61  PROTECTION.  fla
20cf0 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f  gs |= pFile->pro
20d00 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
20d10 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20d20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
20d30 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
20d40 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29  ingMode(pFile) )
20d50 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
20d60 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
20d70 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ROXY;.  }.#endif
20d80 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
20d90 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
20da0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30  (pFile->zPath, 0
20db0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26  , flags, 0, 0, &
20dc0 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63  pLock);.  if( rc
20dd0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
20de0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
20df0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
20e00 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44  ADB ){.      isD
20e10 73 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20  stCorrupt = 1;. 
20e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20e30 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
20e40 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
20e50 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
20e60 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
20e90 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
20ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20eb0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
20ec0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
20ed0 0a 20 20 2f 2a 20 67 65 74 20 74 68 65 20 73 72  .  /* get the sr
20ee0 63 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  c file descripto
20ef0 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20 74 68  r adhering to th
20f00 65 20 64 62 20 73 74 72 75 63 74 20 61 63 63 65  e db struct acce
20f10 73 73 20 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20  ss rules .   ** 
20f20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64  this code is mod
20f30 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69 74  eled after sqlit
20f40 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
20f50 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a  ) in main.c.   *
20f60 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  / .  sqlite3_mut
20f70 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62 2d 3e  ex_enter(srcdb->
20f80 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 72  mutex);.  if( sr
20f90 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20  cdb->nDb>0 ){.  
20fa0 20 20 70 53 72 63 42 74 72 65 65 20 3d 20 73 72    pSrcBtree = sr
20fb0 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b  cdb->aDb[0].pBt;
20fc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 42  .  }.  if( pSrcB
20fd0 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
20fe0 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a 20 20  r *pSrcPager;.  
20ff0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21000 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a  ter(pSrcBtree);.
21010 20 20 20 20 70 53 72 63 50 61 67 65 72 20 3d 20      pSrcPager = 
21020 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
21030 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20  r(pSrcBtree);.  
21040 20 20 61 73 73 65 72 74 28 20 70 53 72 63 50 61    assert( pSrcPa
21050 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 72  ger!=0 );.    sr
21060 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  c_file = sqlite3
21070 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50 61  PagerFile(pSrcPa
21080 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
21090 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b  ( src_file!=0 );
210a0 0a 20 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c  .    if( src_fil
210b0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
210c0 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c 61 67       int srcFlag
210d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 72  s = 0;.      pSr
210e0 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  cFile = (unixFil
210f0 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a 23 69  e *)src_file;.#i
21100 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21110 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
21120 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
21130 5f 5f 29 0a 20 20 20 20 20 20 69 66 20 28 28 70  __).      if ((p
21140 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  SrcFile->openFla
21150 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20  gs & O_RDWR) == 
21160 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20 20 20  O_RDWR) {.      
21170 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c    srcFlags = SQL
21180 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
21190 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  TE;.      } else
211a0 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c   {.        srcFl
211b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
211c0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
211d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
211e0 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  srcFlags = SQLIT
211f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
21200 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
21210 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
21220 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
21230 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 70 53 72   srcFlags |= pSr
21240 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  cFile->protFlags
21250 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
21260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
21270 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
21280 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
21290 67 4d 6f 64 65 28 70 53 72 63 46 69 6c 65 29 20  gMode(pSrcFile) 
212a0 29 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c  ){.        srcFl
212b0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
212c0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20  EN_AUTOPROXY;.  
212d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
212e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
212f0 6f 70 65 6e 5f 76 32 28 70 53 72 63 46 69 6c 65  open_v2(pSrcFile
21300 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63 64 62 32  ->zPath, &srcdb2
21310 2c 20 73 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a  , srcFlags, 0);.
21320 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21340 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20 64 65     /* start a de
21350 66 65 72 72 65 64 20 74 72 61 6e 73 61 63 74 69  ferred transacti
21360 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f 20 65  on and read to e
21370 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 20  stablish a read 
21380 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
21390 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
213a0 63 28 73 72 63 64 62 32 2c 20 22 42 45 47 49 4e  c(srcdb2, "BEGIN
213b0 20 44 45 46 45 52 52 45 44 3b 20 50 52 41 47 4d   DEFERRED; PRAGM
213c0 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  A schema_version
213d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
213f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
21400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
21410 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
21420 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
21430 20 20 20 20 20 20 20 20 69 73 53 72 63 43 6f 72          isSrcCor
21440 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
21450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21460 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
21470 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c  orrupt(src_file,
21480 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
21490 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RED,.           
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 26 63 6f 72 72 75 70 74 53 72 63 46 69 6c    &corruptSrcFil
214d0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  eLock);.        
214e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
214f0 20 20 7d 0a 20 20 69 66 28 20 21 73 72 63 64 62    }.  if( !srcdb
21500 32 20 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e  2 || pSrcFile==N
21510 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d  ULL || pSrcFile-
21520 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63 20 3d 20  >h<0){.    rc = 
21530 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
21540 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
21550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21560 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65  goto end_replace
21570 5f 64 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  _database;.  }. 
21580 20 2f 2a 20 62 6f 74 68 20 64 61 74 61 62 61 73   /* both databas
21590 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20 61 70  es are locked ap
215a0 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 63 6f 70  propriately, cop
215b0 79 20 74 68 65 20 73 72 63 20 77 61 6c 20 6a 6f  y the src wal jo
215c0 75 72 6e 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20  urnal if .   ** 
215d0 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64 20 74  one exists and t
215e0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 64  hen the actual d
215f0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
21600 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28 73 72 63  */.  strlcpy(src
21610 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c  WalPath, pSrcFil
21620 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
21630 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63  HLEN+5);.  strlc
21640 61 74 28 73 72 63 57 61 6c 50 61 74 68 2c 20 22  at(srcWalPath, "
21650 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  -wal", MAXPATHLE
21660 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61 6c 46 44  N+5);.  srcWalFD
21670 20 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c 50 61   = open(srcWalPa
21680 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  th, O_RDONLY);. 
21690 20 69 66 28 20 21 28 73 72 63 57 61 6c 46 44 3c   if( !(srcWalFD<
216a0 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 64  0) ){.    char d
216b0 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  stWalPath[MAXPAT
216c0 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74  HLEN+5];.    int
216d0 20 64 73 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a   dstWalFD = -1;.
216e0 20 20 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67      int protFlag
216f0 73 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 6c 63  s = 0;.    strlc
21700 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70  py(dstWalPath, p
21710 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
21720 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20  PATHLEN+5);.    
21730 73 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61  strlcat(dstWalPa
21740 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50  th, "-wal", MAXP
21750 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20 20 20 20  ATHLEN+5);..    
21760 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 43 68 69  rc = unixOpenChi
21770 6c 64 46 69 6c 65 28 64 73 74 57 61 6c 50 61 74  ldFile(dstWalPat
21780 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  h, O_RDWR|O_CREA
21790 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  T, SQLITE_OPEN_W
217a0 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
217c0 72 6f 74 46 6c 61 67 73 2c 20 26 64 73 74 57 61  rotFlags, &dstWa
217d0 6c 46 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63  lFD);.    if( rc
217e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
217f0 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c       s = copyfil
21800 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b  e_state_alloc();
21810 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 73 72 63  .      lseek(src
21820 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53  WalFD, 0, SEEK_S
21830 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b  ET);.      lseek
21840 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45  (dstWalFD, 0, SE
21850 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69  EK_SET);.      i
21860 66 28 20 66 63 6f 70 79 66 69 6c 65 28 73 72 63  f( fcopyfile(src
21870 57 61 6c 46 44 2c 20 64 73 74 57 61 6c 46 44 2c  WalFD, dstWalFD,
21880 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54   s, COPYFILE_DAT
21890 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  A) ){.        in
218a0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
218b0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
218c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   {.          cas
218d0 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
218e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
218f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
21900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21910 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
21920 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
21930 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
21940 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
21950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
21960 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
21970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
21980 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
21990 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  e(s);.      clos
219a0 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20  e(dstWalFD);.   
219b0 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73 72 63   }.    close(src
219c0 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20 69 66  WalFD);.  }.  if
219d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
219e0 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f 72 65  ){.    /* before
219f0 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75 72 65   we copy, ensure
21a00 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
21a10 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 69  hange counter wi
21a20 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a  ll be modified *
21a30 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 73  /.    uint32_t s
21a40 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  rcChange = 0;.  
21a50 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74 43 68    uint32_t dstCh
21a60 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 72  ange = 0;.    pr
21a70 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c  ead(pSrcFile->h,
21a80 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c 20   &srcChange, 4, 
21a90 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64 28 70  24);.    pread(p
21aa0 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61  File->h, &dstCha
21ab0 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20  nge, 4, 24);.   
21ac0 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 74 68   .    /* copy th
21ad0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
21ae0 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63 6f 70  e */.    s = cop
21af0 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f  yfile_state_allo
21b00 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70  c();.    lseek(p
21b10 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53  SrcFile->h, 0, S
21b20 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 6c 73  EEK_SET);.    ls
21b30 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c  eek(pFile->h, 0,
21b40 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
21b50 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70 53  if( fcopyfile(pS
21b60 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  rcFile->h, pFile
21b70 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
21b80 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20  _DATA) ){.      
21b90 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
21ba0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
21bb0 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
21bc0 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
21bd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21be0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
21bf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
21c00 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
21c10 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
21c20 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20  pFile, err);.   
21c30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21c40 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
21c50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 70 79  }.    }.    copy
21c60 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28  file_state_free(
21c70 73 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20  s);.    .    if 
21c80 28 73 72 63 43 68 61 6e 67 65 20 3d 3d 20 64 73  (srcChange == ds
21c90 74 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20 20  tChange) {.     
21ca0 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 63   /* modify the c
21cb0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
21cc0 20 66 6f 72 63 65 20 70 61 67 65 20 7a 65 72 6f   force page zero
21cd0 20 74 6f 20 62 65 20 72 65 6c 6f 61 64 65 64 20   to be reloaded 
21ce0 2a 2f 0a 20 20 20 20 20 20 64 73 74 43 68 61 6e  */.      dstChan
21cf0 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72  ge ++;.      pwr
21d00 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64  ite(pFile->h, &d
21d10 73 74 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29  stChange, 4, 24)
21d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
21d30 28 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 29  ( isSrcCorrupt )
21d40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
21d50 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
21d60 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20  rrupt(src_file, 
21d70 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
21d80 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
21d90 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74 68 20 74    /* done with t
21da0 68 65 20 73 6f 75 72 63 65 20 64 62 20 73 6f 20  he source db so 
21db0 65 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  end the transact
21dc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ion */.    sqlit
21dd0 65 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20  e3_exec(srcdb2, 
21de0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
21df0 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72  0);.  }.  /* zer
21e00 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f  o out any old jo
21e10 75 72 6e 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f  urnal clutter */
21e20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
21e40 73 6b 69 70 57 41 4c 20 3d 20 28 73 72 63 57 61  skipWAL = (srcWa
21e50 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20  lFD<0)?0:1;.    
21e60 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75  unixInvalidateSu
21e70 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65  pportFiles(pFile
21e80 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a  , skipWAL);.  }.
21e90 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64    .end_replace_d
21ea0 61 74 61 62 61 73 65 3a 0a 20 20 69 66 28 20 70  atabase:.  if( p
21eb0 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20  SrcBtree ){.    
21ec0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 72  sqlite3_close(sr
21ed0 63 64 62 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  cdb2);.    sqlit
21ee0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 53 72  e3BtreeLeave(pSr
21ef0 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  cBtree);.  }.  s
21f00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21f10 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  ve(srcdb->mutex)
21f20 3b 0a 20 20 69 66 28 20 69 73 44 73 74 43 6f 72  ;.  if( isDstCor
21f30 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rupt ){.    sqli
21f40 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
21f50 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
21f60 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
21f70 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
21f80 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
21f90 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
21fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21fb0 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 53 51 4c  c;.}.#define SQL
21fc0 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
21fd0 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65 63 6b 20  LEN 16./* Check 
21fe0 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e  for a conflictin
21ff0 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20  g lock.  If one 
22000 69 73 20 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20  is found, print 
22010 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f 6e 20 73  an this. ** on s
22020 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 75  tandard output u
22030 73 69 6e 67 20 74 68 65 20 66 6f 72 6d 61 74 20  sing the format 
22040 73 74 72 69 6e 67 20 67 69 76 65 6e 20 61 6e 64  string given and
22050 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a 2a 20 49   return 1.. ** I
22060 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 63  f there are no c
22070 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 73  onflicting locks
22080 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a  , return 0.. */.
22090 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
220a0 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69 64 5f 74  sLocked(.  pid_t
220b0 20 70 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   pid,           
220c0 20 2f 2a 20 50 49 44 20 74 6f 20 74 65 73 74 20   /* PID to test 
220d0 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a  for lock owner *
220e0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
220f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
22100 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
22110 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74  check */.  int t
22120 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
22130 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46   /* F_RDLCK or F
22140 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69  _WRLCK */.  unsi
22150 67 6e 65 64 20 69 6e 74 20 69 4f 66 73 74 2c 20  gned int iOfst, 
22160 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
22170 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  of the lock */. 
22180 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
22190 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  nt,    /* Number
221a0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
221b0 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
221c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
221d0 70 65 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f  pe     /* Type o
221e0 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  f lock */.){.  s
221f0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a  truct flock lk;.
22200 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
22210 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c 20 73  memset(&lk, 0, s
22220 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b  izeof(lk));.  lk
22230 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  .l_type = type;.
22240 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20    lk.l_whence = 
22250 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c  SEEK_SET;.  lk.l
22260 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74 3b 0a  _start = iOfst;.
22270 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e    lk.l_len = iCn
22280 74 3b 0a 20 20 0a 20 20 69 66 28 20 70 69 64 21  t;.  .  if( pid!
22290 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
222a0 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69 66 6e  E_ANYPID ){.#ifn
222b0 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44 0a 23  def F_GETLKPID.#
222c0 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54 4c 4b   warning F_GETLK
222d0 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c 20 5f  PID undefined, _
222e0 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74  sqlite3_lockstat
222f0 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74  e falling back t
22300 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20 65 72  o F_GETLK.    er
22310 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  r = fcntl(h, F_G
22320 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73  ETLK, &lk);.#els
22330 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d  e.    lk.l_pid =
22340 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20 3d 20   pid;.    err = 
22350 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b  fcntl(h, F_GETLK
22360 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e 64 69  PID, &lk);.#endi
22370 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  f.  }else{.    e
22380 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f  rr = fcntl(h, F_
22390 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d  GETLK, &lk);.  }
223a0 0a 20 20 0a 20 20 69 66 28 20 65 72 72 3d 3d 28  .  .  if( err==(
223b0 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  -1) ){.    fprin
223c0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 6e 74  tf(stderr, "fcnt
223d0 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20 65 72  l(%d) failed: er
223e0 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72  rno=%d\n", h, er
223f0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
22400 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   -1;.  }.  .  if
22410 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  ( lk.l_type!=F_U
22420 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d 53 51  NLCK && (pid==SQ
22430 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
22440 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69  NYPID || lk.l_pi
22450 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66 64 65  d==pid) ){.#ifde
22460 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22470 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
22480 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64  r, "%s lock held
22490 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65   by %d\n", zType
224a0 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29  , (int)lk.l_pid)
224b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
224c0 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65  urn 1;.  } .  re
224d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
224e0 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74  c int unixLockst
224f0 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65 20  atePid(unixFile 
22500 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74 20 2a 29  *, pid_t, int *)
22510 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51  ;..#endif /* (SQ
22520 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
22530 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
22540 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
22550 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  /.../*.** If *pA
22560 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
22570 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
22580 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
22590 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
225a0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
225b0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
225c0 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
225d0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
225e0 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
225f0 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
22600 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
22610 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
22620 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
22630 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
22640 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42  c void unixModeB
22650 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  it(unixFile *pFi
22660 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
22670 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
22680 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
22690 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
226a0 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
226b0 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
226c0 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
226d0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
226e0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
226f0 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
22700 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
22710 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
22720 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f   }.}../*.** Info
22730 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
22740 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
22750 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
22760 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
22770 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
22780 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
22790 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
227a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
227b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
227c0 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
227d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
227e0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
227f0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
22800 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
22810 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
22820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22830 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
22840 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
22850 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
22860 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
22870 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
22880 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
22890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
228a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
228b0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
228c0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
228d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
228e0 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
228f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22900 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
22910 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
22920 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
22930 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
22940 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
22950 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
22960 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
22970 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
22980 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
22990 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
229a0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
229b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
229c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
229d0 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
229e0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
229f0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
22a00 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
22a10 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
22a20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22a40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22a50 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
22a60 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
22a70 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
22a80 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
22a90 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
22aa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22ac0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22ad0 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
22ae0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
22af0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
22b00 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
22b10 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
22b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22b40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22b50 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
22b60 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
22b70 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
22b80 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
22b90 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
22ba0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
22bb0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
22bc0 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
22bd0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
22be0 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
22bf0 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
22c00 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
22c10 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
22c20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
22c30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22c40 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
22c50 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
22c60 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
22c70 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
22c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c90 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
22ca0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
22cb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
22cc0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
22cd0 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
22ce0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
22cf0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
22d00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
22d10 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_GET_LOCKPRO
22d20 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
22d30 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
22d40 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
22d50 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
22d60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
22d70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22d80 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
22d90 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53  PLE__) */.#if (S
22da0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
22db0 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
22dc0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
22dd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22de0 46 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45 5f 44  FCNTL_TRUNCATE_D
22df0 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
22e00 20 72 65 74 75 72 6e 20 75 6e 69 78 54 72 75 6e   return unixTrun
22e10 63 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69  cateDatabase(pFi
22e20 6c 65 2c 20 28 70 41 72 67 20 3f 20 28 2a 28 69  le, (pArg ? (*(i
22e30 6e 74 20 2a 29 70 41 72 67 29 20 3a 20 30 29 29  nt *)pArg) : 0))
22e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22e50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 45   SQLITE_FCNTL_RE
22e60 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20  PLACE_DATABASE: 
22e70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
22e80 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61  nixReplaceDataba
22e90 73 65 28 70 46 69 6c 65 2c 20 28 73 71 6c 69 74  se(pFile, (sqlit
22ea0 65 33 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  e3 *)pArg);.    
22eb0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
22ec0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
22ed0 45 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20 20 4c  E_PID: {.      L
22ee0 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 70 4c 6f  ockstatePID *pLo
22ef0 63 6b 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69  ckstate;.      i
22f00 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 0a 20 20  nt rc;.      .  
22f10 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
22f20 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  LL ){.        re
22f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
22f40 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
22f50 20 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 28    pLockstate = (
22f60 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 29 70  LockstatePID *)p
22f70 41 72 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Arg;.      rc = 
22f80 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
22f90 28 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73 74 61  (pFile, pLocksta
22fa0 74 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f 63 6b  te->pid, &(pLock
22fb0 73 74 61 74 65 2d 3e 73 74 61 74 65 29 29 3b 0a  state->state));.
22fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22fd0 0a 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23 65  .    }.      .#e
22fe0 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f  ndif /* (SQLITE_
22ff0 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
23000 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
23010 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
23020 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23030 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
23040 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
23050 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
23060 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
23070 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
23080 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
23090 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
230a0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
230b0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
230c0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
230d0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
230e0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
230f0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
23100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
23110 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
23120 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
23130 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
23140 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
23150 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
23160 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
23170 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
23180 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
23190 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
231a0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
231b0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
231c0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
231d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
231e0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
231f0 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
23200 28 76 6f 69 64 29 70 46 69 6c 65 3b 0a 20 20 72  (void)pFile;.  r
23210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
23220 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
23230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23240 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
23250 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
23260 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
23270 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74   This VFS is set
23280 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51   up to return SQ
23290 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
232a0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62  SAFE_OVERWRITE b
232b0 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f  y default..** Ho
232c0 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69  wever, that choi
232d0 63 65 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73  ce is contravers
232e0 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69  ial since techni
232f0 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c  cally the underl
23300 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73  ying.** file sys
23310 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77  tem does not alw
23320 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65  ays provide powe
23330 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73  rsafe overwrites
23340 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  .  (In other.** 
23350 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70  words, after a p
23360 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c  ower-loss event,
23370 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69   parts of the fi
23380 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76  le that were nev
23390 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69  er.** written mi
233a0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
233b0 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65   altered.)  Howe
233c0 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65  ver, non-PSOW be
233d0 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a  havior is very,.
233e0 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41  ** very rare.  A
233f0 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f  nd asserting PSO
23400 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  W makes a large 
23410 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  reduction in the
23420 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65   amount.** of re
23430 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a  quired I/O for j
23440 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65  ournaling, since
23450 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e   a lot of paddin
23460 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e  g is eliminated.
23470 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c  .**  Hence, whil
23480 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  e POWERSAFE_OVER
23490 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64  WRITE is on by d
234a0 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73  efault, there is
234b0 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a   a file-control.
234c0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ** available to 
234d0 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20  turn it off and 
234e0 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65  URI query parame
234f0 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ter available to
23500 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f   turn it off..*/
23510 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23520 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
23530 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
23540 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
23550 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
23560 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 2d  le*)id;.  if( p-
23570 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
23580 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
23590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
235a0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
235b0 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 65 6c  OVERWRITE;.  }el
235c0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
235d0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
235e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
235f0 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
23600 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
23610 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
23620 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
23630 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
23640 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
23650 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
23660 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
23670 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
23680 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
23690 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
236a0 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
236b0 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
236c0 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
236d0 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
236e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
236f0 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
23700 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
23710 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
23720 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
23730 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
23740 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
23750 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
23760 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
23770 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
23780 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
23790 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
237a0 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
237b0 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
237c0 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
237d0 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
237e0 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
237f0 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
23800 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
23810 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
23820 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
23830 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
23840 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
23850 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
23860 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
23870 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
23880 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
23890 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
238a0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
238b0 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
238c0 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
238d0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
238e0 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
238f0 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
23900 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
23910 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
23920 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
23930 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
23940 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
23950 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
23960 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
23970 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
23980 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
23990 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
239a0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
239b0 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
239c0 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
239d0 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
239e0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
239f0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
23a00 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
23a10 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
23a20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
23a30 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
23a40 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
23a50 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
23a60 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
23a70 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
23a80 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
23a90 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
23aa0 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
23ab0 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
23ac0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
23ad0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
23ae0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
23af0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
23b00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
23b10 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
23b20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
23b30 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
23b40 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
23b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23b60 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
23b70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
23b80 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
23b90 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
23ba0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23bb0 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
23bc0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
23bd0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
23be0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
23bf0 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
23c00 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
23c10 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
23c20 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
23c30 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
23c40 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
23c50 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
23c60 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
23c70 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c90 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
23ca0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
23cb0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
23cc0 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
23cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
23ce0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
23cf0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
23d00 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
23d10 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
23d20 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
23d30 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23d40 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
23d50 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
23d60 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
23d70 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23d80 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
23d90 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
23da0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
23db0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
23dc0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
23dd0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
23de0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
23df0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
23e00 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
23e10 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
23e20 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
23e30 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
23e40 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
23e50 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23e60 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
23e70 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
23e80 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
23e90 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
23ea0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
23eb0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
23ec0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
23ed0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
23ee0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
23ef0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
23f00 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
23f10 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
23f20 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
23f30 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
23f40 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
23f50 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
23f60 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
23f70 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
23f80 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
23f90 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
23fa0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
23fb0 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
23fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23fd0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
23fe0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
23ff0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
24000 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
24010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
24020 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
24030 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
24040 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24060 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
24070 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
24080 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
24090 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
240a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
240b0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
240c0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
240d0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
240e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
240f0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
24100 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
24110 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
24120 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
24130 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
24140 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
24150 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
24160 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
24170 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
24180 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
24190 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
241a0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
241b0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
241c0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
241d0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
241e0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
241f0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
24200 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
24210 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
24220 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
24230 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
24240 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
24250 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
24260 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
24270 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
24280 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
24290 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  temLock(.  unixS
242a0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
242b0 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  , /* Apply locks
242c0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
242d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
242e0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
242f0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
24300 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
24310 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
24320 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
24330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24340 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
24350 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
24360 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
24370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24380 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
24390 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
243a0 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
243b0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
243c0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
243d0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
243e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
243f0 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  _OK;   /* Result
24400 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
24410 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
24420 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
24430 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
24440 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
24450 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
24460 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24470 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
24480 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
24490 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
244a0 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
244b0 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
244c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
244d0 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
244e0 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65  n==1 || lockType
244f0 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20  !=F_RDLCK );..  
24500 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74  /* Locks are wit
24510 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  hin range */.  a
24520 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e  ssert( n>=1 && n
24530 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  <SQLITE_SHM_NLOC
24540 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
24550 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
24560 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
24570 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
24580 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65  meters */.    me
24590 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65  mset(&f, 0, size
245a0 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f  of(f));.    f.l_
245b0 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
245c0 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20  .    f.l_whence 
245d0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
245e0 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
245f0 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20  ;.    f.l_len = 
24600 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  n;..    rc = osF
24610 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
24620 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
24630 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
24640 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
24650 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
24660 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
24670 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
24680 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
24690 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
246a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
246b0 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
246c0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
246d0 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
246e0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
246f0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
24700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24710 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
24720 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
24730 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
24740 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
24750 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
24760 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24770 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24780 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
24790 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
247a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
247b0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
247c0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
247d0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
247e0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
247f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
24800 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
24810 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24820 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
24830 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
24840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
24850 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
24860 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
24870 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
24880 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
24890 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
248a0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
248b0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
248c0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
248d0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
248e0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
248f0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
24900 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
24910 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
24920 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
24930 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
24940 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
24950 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
24960 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
24970 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
24980 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
24990 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
249a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
249b0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
249c0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
249d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
249e0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
249f0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
24a00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
24a10 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
24a20 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
24a30 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
24a40 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
24a50 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f  c;        .}.../
24a60 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
24a70 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
24a80 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
24a90 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
24aa0 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
24ab0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
24ac0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
24ad0 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
24ae0 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
24af0 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
24b00 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
24b10 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
24b20 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
24b30 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
24b40 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
24b50 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
24b60 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
24b70 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
24b80 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
24b90 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65   if( p && p->nRe
24ba0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  f==0 ){.    int 
24bb0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
24bc0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
24bd0 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c  Inode );.    sql
24be0 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
24bf0 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
24c00 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
24c10 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
24c20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
24c30 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  .        munmap(
24c40 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
24c50 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
24c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24c70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24c80 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
24c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24ca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24cb0 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
24cc0 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
24cd0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
24ce0 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
24cf0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
24d00 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
24d10 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
24d20 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
24d30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24d40 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  );.  }.}..#if de
24d50 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24d60 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
24d70 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
24d80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
24d90 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65  r *proxySharedMe
24da0 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69  moryBasePath(uni
24db0 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66  xFile *);.#endif
24dc0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ../*.** Open a s
24dd0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
24de0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
24df0 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  h open database 
24e00 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a  file pDbFd.  .**
24e10 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
24e20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24e30 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c  uses mmapped fil
24e40 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
24e50 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  le used to imple
24e60 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ment shared-memo
24e70 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d  ry is in the sam
24e80 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61  e directory.** a
24e90 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  s the open datab
24ea0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73  ase file and has
24eb0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
24ec0 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  s the open datab
24ed0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68  ase.** file with
24ee0 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66   the "-shm" suff
24ef0 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65  ix added.  For e
24f00 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64  xample, if the d
24f10 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
24f20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  is "/home/user1/
24f30 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20  config.db" then 
24f40 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73  the file that is
24f50 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61   created and mma
24f60 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72  pped.** for shar
24f70 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
24f80 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f  e called "/home/
24f90 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d  user1/config.db-
24fa0 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e  shm".  .**.** An
24fb0 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74  other approach t
24fc0 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65  o is to use file
24fd0 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72  s in /dev/shm or
24fe0 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a   /dev/tmp or an.
24ff0 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d  ** some other tm
25000 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69  pfs mount. But i
25010 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69  f a file in a di
25020 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72  fferent director
25030 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61  y.** from the da
25040 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
25050 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72  sed, then differ
25060 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69  ing access permi
25070 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63  ssions.** or a c
25080 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61  hroot() might ca
25090 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e  use two differen
250a0 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74  t processes on t
250b0 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62  he same.** datab
250c0 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73  ase to end up us
250d0 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69  ing different fi
250e0 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d  les for shared m
250f0 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e  emory - .** mean
25100 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d  ing that their m
25110 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20  emory would not 
25120 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64  really be shared
25130 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20   - resulting.** 
25140 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  in database corr
25150 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68  uption.  Neverth
25160 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66  eless, this tmpf
25170 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20  s file usage.** 
25180 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61  can be enabled a
25190 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75  t compile-time u
251a0 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48  sing -DSQLITE_SH
251b0 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65  M_DIRECTORY="/de
251c0 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65  v/shm".** or the
251d0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68   equivalent.  Th
251e0 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c  e use of the SQL
251f0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
25200 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a  Y compile-time.*
25210 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73  * option results
25220 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
25230 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c  ble build of SQL
25240 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20  ite;  builds of 
25250 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77  SQLite.** that w
25260 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51  ith differing SQ
25270 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25280 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65  RY settings atte
25290 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  mpt to use the.*
252a0 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  * same database 
252b0 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
252c0 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20   time, database 
252d0 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
252e0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
252f0 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  . The SQLITE_SHM
25300 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
25310 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
25320 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20  s considered.** 
25330 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e  "unsupported" an
25340 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e  d may go away in
25350 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65   a future SQLite
25360 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20   release..**.** 
25370 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
25380 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
25390 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
253a0 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
253b0 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
253c0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
253d0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
253e0 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
253f0 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
25400 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
25410 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
25420 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
25430 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
25440 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ared..**.** If t
25450 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
25460 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64  base file (pDbFd
25470 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22  ) is using the "
25480 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a  unix-excl" VFS.*
25490 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  * that means tha
254a0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
254b0 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
254c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
254d0 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20   and.** that no 
254e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
254f0 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64  are able to read
25500 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61   or write the da
25510 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74  tabase.  In.** t
25520 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20  hat case, we do 
25530 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20  not really need 
25540 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
25550 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  No shared memory
25560 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61  .** file is crea
25570 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64  ted.  The shared
25580 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
25590 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68  simulated with h
255a0 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  eap memory..*/.s
255b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
255c0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75  enSharedMemory(u
255d0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  nixFile *pDbFd){
255e0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
255f0 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  m *p = 0;       
25600 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
25610 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
25620 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  d */.  struct un
25630 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25640 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  ode;   /* The un
25650 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
25660 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
25670 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25690 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
256a0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
256b0 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  node;          /
256c0 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66  * The inode of f
256d0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68  d */.  char *zSh
256e0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
256f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25700 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20  f the file used 
25710 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74  for SHM */.  int
25720 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20   nShmFilename;  
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25740 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20  Size of the SHM 
25750 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65  filename in byte
25760 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  s */..  /* Alloc
25770 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
25780 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62  e new unixShm ob
25790 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73  ject. */.  p = s
257a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
257b0 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
257c0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
257d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
257e0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
257f0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73  zeof(*p));.  ass
25800 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
25810 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
25820 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75  ck to see if a u
25830 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
25840 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
25850 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74  . Reuse an exist
25860 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20  ing.  ** one if 
25870 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20  present. Create 
25880 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
25890 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75  essary..  */.  u
258a0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
258b0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  .  pInode = pDbF
258c0 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68  d->pInode;.  pSh
258d0 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  mNode = pInode->
258e0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20  pShmNode;.  if( 
258f0 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
25900 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
25910 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
25920 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29        /* fstat()
25930 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61   info for databa
25940 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
25950 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20  /* Call fstat() 
25960 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
25970 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
25980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25990 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  le. If.    ** a 
259a0 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69  new *-shm file i
259b0 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74  s created, an at
259c0 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61  tempt will be ma
259d0 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a  de to create it.
259e0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
259f0 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
25a00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25a10 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e   osFstat(pDbFd->
25a20 68 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49  h, &sStat) && pI
25a30 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25a40 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ck==0 ){.      r
25a50 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25a60 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
25a70 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25a80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73  .    }..    cons
25a90 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74  t char *zBasePat
25aa0 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  h = pDbFd->zPath
25ab0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
25ac0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
25ad0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25ae0 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 49  G_STYLE.    /* I
25af0 66 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69  f pDbFd is confi
25b00 67 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79  gured with proxy
25b10 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75   locking mode, u
25b20 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  se the local .  
25b30 20 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20     ** lock file 
25b40 70 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e  path to determin
25b50 65 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20  e the -shm file 
25b60 70 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20 20  path.     */.   
25b70 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
25b80 69 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29  ingMode(pDbFd) )
25b90 7b 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74  {.      zBasePat
25ba0 68 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d  h = proxySharedM
25bb0 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44  emoryBasePath(pD
25bc0 62 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bFd);.      if( 
25bd0 21 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20  !zBasePath ){.  
25be0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25bf0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
25c00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
25c10 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
25c20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
25c30 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
25c40 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
25c50 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
25c60 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
25c70 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25c80 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20  ) + 31;.#else.  
25c90 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
25ca0 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   6 + (int)strlen
25cb0 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e  (zBasePath);.#en
25cc0 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
25cd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
25ce0 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
25cf0 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
25d00 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
25d10 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
25d20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
25d40 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25d50 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
25d60 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
25d70 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b  zeof(*pShmNode)+
25d80 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nShmFilename);. 
25d90 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
25da0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
25db0 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
25dc0 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
25dd0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
25de0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
25df0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
25e00 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
25e10 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25e40 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
25e50 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
25e70 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
25e80 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
25e90 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
25ea0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
25eb0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
25ec0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
25ed0 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68  -shm", zBasePath
25ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
25ef0 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
25f00 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65  >zPath, zShmFile
25f10 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
25f20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
25f30 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
25f40 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
25f50 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
25f60 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
25f70 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
25f80 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
25f90 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
25fa0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
25fb0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
25fc0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25fd0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
25fe0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25ff0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
26000 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
26010 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
26020 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
26030 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
26040 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
26050 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
26060 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
26070 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
26080 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
26090 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
260a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
260b0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 45 52 53 49  ITE_ENABLE_PERSI
260c0 53 54 5f 57 41 4c 29 26 26 28 53 51 4c 49 54 45  ST_WAL)&&(SQLITE
260d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
260e0 53 54 59 4c 45 20 5c 0a 20 20 20 20 7c 7c 20 64  STYLE \.    || d
260f0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
26100 29 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  )).         || (
26110 70 44 62 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73  pDbFd->openFlags
26120 20 26 20 4f 5f 52 44 57 52 29 20 21 3d 20 4f 5f   & O_RDWR) != O_
26130 52 44 57 52 0a 23 65 6e 64 69 66 0a 20 20 20 20  RDWR.#endif.    
26140 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26150 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
26160 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
26170 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
26180 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
26190 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
261a0 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
261b0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
261c0 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
261d0 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
261e0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
261f0 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
26200 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
26210 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
26220 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
26230 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
26240 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
26250 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
26260 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
26270 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
26280 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
26290 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
262a0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
262b0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
262c0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
262d0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
262e0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
262f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26300 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
26310 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
26320 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
26330 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
26340 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
26350 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
26360 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
26370 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
26380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
26390 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
263a0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
263b0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
263c0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
263d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
263e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e         /* If run
263f0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74  ning as root set
26400 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20   the uid/gid of 
26410 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20  the shm file to 
26420 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  match.          
26430 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69 64  */.          uid
26450 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69  _t euid = geteui
26460 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  d();.          i
26470 66 28 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69  f( (!pShmNode->i
26480 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 65 75  sReadonly) && eu
26490 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
264a0 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20  sStat.st_uid || 
264b0 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61 74  getegid()!=sStat
264c0 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  .st_gid) ){.    
264d0 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46 63          if( osFc
264e0 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
264f0 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
26500 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b  sStat.st_gid) ){
26510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
26520 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
26530 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20  _SHMOPEN;.      
26540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26550 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
26590 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
265a0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
265b0 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
265c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
265d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
265e0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
265f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
26600 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
26610 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
26620 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
26630 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
26640 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
26650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26660 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
26670 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
26680 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
26690 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
266a0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
266b0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
266c0 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
266d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
266e0 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
266f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
26700 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
26710 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
26720 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
26730 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
26740 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
26750 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
26760 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
26770 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
26780 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
26790 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
267a0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
267b0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
267c0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
267d0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
267e0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
267f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26800 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
26810 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
26820 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
26830 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
26840 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
26850 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26860 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26870 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
26880 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
26890 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
268a0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
268b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
268c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
268d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
268e0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
268f0 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
26900 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
26910 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
26920 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
26930 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
26940 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
26950 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
26960 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
26970 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26990 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
269a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
269b0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
269c0 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
269d0 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
269e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
269f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
26a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
26a10 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
26a20 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
26a30 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
26a40 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
26a50 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
26a60 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
26a70 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
26a80 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
26a90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
26aa0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
26ab0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
26ac0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
26ad0 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
26ae0 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
26af0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
26b00 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
26b10 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
26b20 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
26b30 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
26b40 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
26b50 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
26b60 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
26b70 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
26b80 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
26b90 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
26ba0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
26bb0 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
26bc0 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
26bd0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
26be0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
26bf0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
26c00 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
26c10 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
26c20 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
26c30 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
26c40 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
26c50 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
26c60 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
26c70 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
26c80 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
26c90 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
26ca0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
26cb0 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
26cc0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
26cd0 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
26ce0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
26cf0 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
26d00 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
26d10 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
26d20 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
26d30 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
26d40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26d50 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
26d60 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
26d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
26d80 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
26d90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
26da0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26dc0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
26dd0 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
26de0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
26df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26e00 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
26e10 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
26e40 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
26e50 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
26e60 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
26e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26e80 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
26e90 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
26ea0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
26eb0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
26ec0 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
26ed0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
26ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26ef0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
26f00 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
26f10 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
26f20 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
26f30 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
26f40 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
26f50 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
26f60 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
26f70 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
26f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26f90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
26fa0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
26fb0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
26fc0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
26fd0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
26fe0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26ff0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
27000 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
27010 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
27020 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
27030 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
27040 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27050 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
27060 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
27070 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
27080 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
27090 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
270a0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
270b0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
270c0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
270d0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
270e0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
270f0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
27100 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68  Region ){.    ch
27110 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20  ar **apNew;     
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e   /* New apRegion
27140 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
27150 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
27160 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
27170 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
27180 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
27190 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
271a0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
271b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
271c0 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f  ed by fstat() */
271d0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
271e0 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
271f0 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ion;..    if( pS
27200 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
27210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
27220 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
27230 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
27240 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
27250 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
27260 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f       ** Check to
27270 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
27280 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
27290 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
272a0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
272b0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
272c0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
272d0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
272e0 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  on)..      */.  
272f0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
27300 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
27310 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
27320 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27330 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20  R_SHMSIZE;.     
27340 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
27350 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  out;.      }.  .
27360 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e        if( sStat.
27370 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b  st_size<nByte ){
27380 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27390 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
273a0 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
273b0 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65   exist. If bExte
273c0 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  nd is set to.   
273d0 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65       ** false, e
273e0 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
273f0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
27400 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
27410 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
27420 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27430 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
27440 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72  if bExtend is tr
27450 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ue, use ftruncat
27460 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
27470 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
27480 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
27490 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  region..        
274a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
274b0 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73  bExtend ) goto s
274c0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
274d0 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
274e0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
274f0 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a  e->h, nByte) ){.
27500 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
27510 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
27520 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
27530 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20  , "ftruncate",. 
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
27560 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
27570 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27580 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
27590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
275a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
275b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
275c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
275d0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
275e0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
275f0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
27600 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
27610 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
27620 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
27630 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
27640 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
27650 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
27660 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
27670 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
27680 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
27690 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
276a0 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
276b0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
276c0 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
276d0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
276e0 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
276f0 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
27700 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
27710 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
27720 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30     pMem = mmap(0
27730 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20  , szRegion,.    
27740 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
27750 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
27760 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
27770 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
27780 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
27790 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
277a0 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d  de->h, pShmNode-
277b0 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
277c0 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
277d0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
277e0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
277f0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
27800 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
27810 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
27820 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
27830 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
27840 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27850 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
27860 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
27870 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
27880 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52  lite3_malloc(szR
27890 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
278a0 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
278b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
278c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
278d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
278e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
278f0 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
27900 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
27910 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
27920 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
27930 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
27940 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b  nRegion] = pMem;
27950 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
27960 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
27970 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
27980 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
27990 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
279a0 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
279b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
279c0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
279d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
279e0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   0;.  }.  if( pS
279f0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
27a00 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ly && rc==SQLITE
27a10 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
27a20 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71  E_READONLY;.  sq
27a30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
27a40 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
27a50 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
27a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
27a70 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
27a80 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
27a90 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a  ory segment..**.
27aa0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
27ab0 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
27ac0 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64  tween SHAREd and
27ad0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
27ae0 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20   is a little.** 
27af0 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74  different here t
27b00 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49  han in posix.  I
27b10 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e  n xShmLock(), on
27b20 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e  e can go from un
27b30 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61  locked.** to sha
27b40 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20  red and back or 
27b50 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
27b60 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62   exclusive and b
27b70 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61  ack.  But one ma
27b80 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d  y.** not go from
27b90 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75   shared to exclu
27ba0 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63  sive or from exc
27bb0 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64  lusive to shared
27bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27bd0 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  unixShmLock(.  s
27be0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
27bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
27c00 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
27c10 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
27c20 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
27c30 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
27c40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
27c50 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
27c60 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
27c70 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
27c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27c90 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
27ca0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
27cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
27ce0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
27cf0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
27d00 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
27d10 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43  e*)fd;      /* C
27d20 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
27d30 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
27d40 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20  */.  unixShm *p 
27d50 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
27d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27d70 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
27d80 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
27d90 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20    unixShm *pX;  
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27db0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
27dc0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
27dd0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e  siblings */.  un
27de0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
27df0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
27e00 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  e;  /* The under
27e10 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65  lying file iNode
27e20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27e30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27e50 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
27e60 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
27e90 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
27ea0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
27eb0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27ec0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
27ed0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
27ee0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27ef0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
27f00 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
27f10 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
27f20 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
27f30 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
27f40 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
27f50 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
27f60 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
27f70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
27f80 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
27f90 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
27fa0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
27fb0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
27fc0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
27fd0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
27fe0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
27ff0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
28000 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
28010 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
28020 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
28030 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
28040 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
28050 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
28060 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61  USIVE)!=0 );.  a
28070 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
28080 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
28090 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
280a0 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
280b0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
280c0 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
280d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
280e0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  k==0 );..  mask 
280f0 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
28100 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61  - (1<<ofst);.  a
28110 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
28120 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
28130 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
28140 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
28150 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
28160 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
28170 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
28180 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
28190 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
281a0 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
281b0 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
281c0 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
281d0 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
281e0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
281f0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
28200 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
28210 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28220 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
28230 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
28240 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
28250 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
28260 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
28270 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
28280 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
28290 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
282a0 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
282b0 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
282c0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
282d0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
282e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
282f0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28300 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e  k(pShmNode, F_UN
28310 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
28320 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
28330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28350 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
28360 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
28370 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
28380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28390 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
283a0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
283b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
283c0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
283d0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
283e0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
283f0 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
28400 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
28410 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
28420 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
28430 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
28440 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
28450 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
28460 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
28470 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
28480 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
28490 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
284a0 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
284b0 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
284c0 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
284d0 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
284e0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
284f0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
28500 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
28510 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
28520 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
28530 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
28540 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
28550 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28560 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
28570 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
28580 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
28590 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
285a0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
285b0 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
285c0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
285d0 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
285e0 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
285f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28600 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
28610 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
28620 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28630 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
28640 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
28650 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
28660 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
28670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28690 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
286a0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
286b0 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
286c0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
286d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
286e0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
286f0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
28700 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
28710 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
28720 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
28730 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
28740 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
28750 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
28760 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
28770 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
28780 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
28790 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
287a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
287b0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
287c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
287d0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
287e0 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
287f0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
28800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
28810 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
28820 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
28830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28840 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
28850 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
28860 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
28870 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
28880 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
28890 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
288a0 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
288b0 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
288c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
288d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
288e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
288f0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
28900 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
28910 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
28920 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
28930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28940 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
28950 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
28960 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
28970 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
28980 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
28990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
289a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
289b0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
289c0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
289d0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
289e0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
289f0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
28a00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
28a10 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68   getpid(), p->sh
28a20 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
28a30 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
28a40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
28a50 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
28a60 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
28a70 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
28a80 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
28a90 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
28aa0 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
28ab0 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
28ac0 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
28ad0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
28ae0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
28af0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
28b00 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
28b10 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
28b20 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
28b30 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
28b40 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
28b50 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
28b60 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
28b70 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
28b80 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
28b90 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
28ba0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
28bb0 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
28bc0 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
28bd0 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
28be0 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
28bf0 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
28c00 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
28c10 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
28c20 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
28c30 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   no shared memor
28c40 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
28c50 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
28c60 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
28c70 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
28c80 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ess no-op..*/.st
28c90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
28ca0 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
28cb0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
28cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28cd0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
28ce0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
28cf0 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d10 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d   Delete shared-m
28d20 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f  emory if true */
28d30 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  .){.  unixShm *p
28d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
28d60 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
28d70 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  osed */.  unixSh
28d80 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
28d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28da0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
28db0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
28dc0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
28dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28de0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
28df0 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
28e00 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
28e10 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
28e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28e30 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
28e40 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
28e50 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
28e60 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
28e70 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
28e80 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
28e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28ea0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
28eb0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73  pShmNode;..  ass
28ec0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
28ed0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
28ee0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
28ef0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
28f00 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
28f10 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d  ode );..  /* Rem
28f20 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
28f30 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
28f40 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
28f50 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
28f60 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
28f70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
28f80 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
28f90 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
28fa0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
28fb0 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
28fc0 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
28fd0 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
28fe0 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
28ff0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
29000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
29010 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
29020 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
29030 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
29040 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
29050 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
29060 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
29070 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
29080 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
29090 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
290a0 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
290b0 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
290c0 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
290d0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
290e0 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
290f0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
29100 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
29110 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
29120 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64  eFlag && pShmNod
29130 65 2d 3e 68 3e 3d 30 20 29 20 7b 0a 20 20 20 20  e->h>=0 ) {.    
29140 20 20 69 66 20 28 64 65 6c 65 74 65 46 6c 61 67    if (deleteFlag
29150 20 3d 3d 20 31 29 20 7b 20 0a 20 20 20 20 20 20   == 1) { .      
29160 20 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64    unlink(pShmNod
29170 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
29180 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
29190 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29  deleteFlag == 2)
291a0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74   {.        /* ft
291b0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
291c0 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32 34 29 3b  ->h, 32 * 1024);
291d0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
291e0 7d 0a 20 20 20 20 0a 20 20 20 20 75 6e 69 78 53  }.    .    unixS
291f0 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
29200 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
29210 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
29220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29230 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
29240 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
29250 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
29260 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
29270 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
29280 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
29290 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
292a0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
292b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
292c0 20 2a 2f 0a 0a 23 69 66 20 28 53 51 4c 49 54 45   */..#if (SQLITE
292d0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
292e0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
292f0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69  __APPLE__).stati
29300 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
29310 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
29320 69 64 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  id);..static int
29330 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53   unixInvalidateS
29340 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69 78  upportFiles(unix
29350 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
29360 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20 20 63 68   skipWAL) {.  ch
29370 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48  ar jPath[MAXPATH
29380 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74 20 7a 4c  LEN+9];.  int zL
29390 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6a 50 61  en = strlcpy(jPa
293a0 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
293b0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b  , MAXPATHLEN+9);
293c0 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d 41 58 50  .  if( zLen<MAXP
293d0 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 73 69  ATHLEN ){.    si
293e0 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 63  ze_t jLen;.    c
293f0 6f 6e 73 74 20 63 68 61 72 20 65 78 74 65 6e 73  onst char extens
29400 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20 7b 20 22  ions[3][9] = { "
29410 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c  -wal", "-journal
29420 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a 20 20 20  ", "-shm" };.   
29430 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69 70 57 41   int j = (skipWA
29440 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  L ? 1 : 0);.    
29450 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a 2b 2b 20  for( ; j<3; j++ 
29460 29 7b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  ){.      .      
29470 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
29480 69 66 20 74 68 65 20 73 68 6d 20 66 69 6c 65 20  if the shm file 
29490 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
294a0 64 20 66 6f 72 20 74 68 69 73 20 70 46 69 6c 65  d for this pFile
294b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6a 3d   */.      if( j=
294c0 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  =2 ){.        un
294d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
294e0 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
294f0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
29500 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
29510 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
29520 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
29530 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
29540 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
29550 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
29560 64 65 20 26 26 20 21 70 53 68 6d 4e 6f 64 65 2d  de && !pShmNode-
29570 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20  >isReadonly ){. 
29580 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
29590 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20  stat sStat;.    
295a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
295b0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
295c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
295d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
295e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
295f0 3e 3d 30 20 26 26 20 21 6f 73 46 73 74 61 74 28  >=0 && !osFstat(
29600 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
29610 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
29620 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
29630 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74 2e  g size = (sStat.
29640 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53 74  st_size<4) ? sSt
29650 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a  at.st_size : 4;.
29660 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29670 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  size>0 ){.      
29680 20 20 20 20 20 20 20 20 62 7a 65 72 6f 28 70 53          bzero(pS
29690 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
296a0 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  [0], size);.    
296b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
296c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
296d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
296f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
29710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
29720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29730 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
29740 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
29750 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
29760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29770 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
29780 65 78 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ex();.      }.  
29790 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c 63      jLen = strlc
297a0 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c  py(&jPath[zLen],
297b0 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20   extensions[j], 
297c0 39 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 4c  9);.      if( jL
297d0 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20 20 20 20  en < 9 ){.      
297e0 20 20 69 6e 74 20 6a 66 6c 61 67 73 20 3d 20 28    int jflags = (
297f0 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e 43 20 3a  j<2) ? O_TRUNC :
29800 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20 20 20 20   O_RDWR;.       
29810 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28   int jfd = open(
29820 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73 29 3b 0a  jPath, jflags);.
29830 20 20 20 20 20 20 20 20 69 66 28 20 6a 66 64 3d          if( jfd=
29840 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
29850 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e     if( errno!=EN
29860 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OENT ){.        
29870 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68      perror(jPath
29880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29890 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
298a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
298b0 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =2 ){.          
298c0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
298d0 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tat;.           
298e0 20 69 66 28 20 21 6f 73 46 73 74 61 74 28 6a 66   if( !osFstat(jf
298f0 64 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  d, &sStat) ){.  
29900 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
29910 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d  gned long size =
29920 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c   (sStat.st_size<
29930 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69  4) ? sStat.st_si
29940 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20  ze : 4;.        
29950 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30        if( size>0
29960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29970 20 20 20 20 75 69 6e 74 33 32 5f 74 20 7a 65 72      uint32_t zer
29980 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
29990 20 20 20 20 20 20 20 70 77 72 69 74 65 28 6a 66         pwrite(jf
299a0 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69 7a 65 5f  d, &zero, (size_
299b0 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  t)size, 0);.    
299c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
299d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
299e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
299f0 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20 20  fsync(jfd);.    
29a00 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64 29        close(jfd)
29a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
29a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29a40 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
29a50 75 6e 69 78 55 6e 73 61 66 65 54 72 75 6e 63 61  unixUnsafeTrunca
29a60 74 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46  teDatabase(unixF
29a70 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 2f  ile *pFile){.  /
29a80 2a 20 74 68 69 73 20 69 73 20 6e 61 73 74 79 20  * this is nasty 
29a90 26 20 62 61 64 2e 20 20 64 65 73 74 72 75 63 74  & bad.  destruct
29aa0 69 6f 6e 20 77 69 74 68 20 70 72 65 6a 75 64 69  ion with prejudi
29ab0 63 65 2e 20 20 77 65 27 6c 6c 20 6c 6f 73 65 20  ce.  we'll lose 
29ac0 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  all the.  ** fil
29ad0 65 20 6c 6f 63 6b 73 20 69 6e 20 74 68 69 73 20  e locks in this 
29ae0 70 72 6f 63 65 73 73 2c 20 68 6f 77 65 76 65 72  process, however
29af0 2e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  . sqlite3_file_c
29b00 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 70 72 6f  ontrol works pro
29b10 70 65 72 6c 79 2e 0a 20 20 2a 2a 20 42 75 74 20  perly..  ** But 
29b20 69 66 20 69 74 20 66 61 69 6c 73 2c 20 74 68 69  if it fails, thi
29b30 73 20 77 6f 72 6b 73 20 61 70 70 72 6f 78 69 6d  s works approxim
29b40 61 74 65 6c 79 0a 20 20 2a 2f 0a 20 20 63 68 61  ately.  */.  cha
29b50 72 20 6a 6f 75 72 6e 61 6c 50 61 74 68 5b 4d 41  r journalPath[MA
29b60 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
29b70 72 20 77 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  r walPath[MAXPAT
29b80 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 72 63 20  HLEN];.  int rc 
29b90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
29ba0 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 66  #ifdef DEBUG.  f
29bb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29bc0 46 6f 72 63 65 20 74 72 75 6e 63 61 74 69 6e 67  Force truncating
29bd0 20 64 61 74 61 62 61 73 65 20 25 73 5c 6e 22 2c   database %s\n",
29be0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
29bf0 23 65 6e 64 69 66 0a 20 20 73 74 72 6c 63 70 79  #endif.  strlcpy
29c00 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 70 46  (journalPath, pF
29c10 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
29c20 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63  ATHLEN);.  strlc
29c30 61 74 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20  at(journalPath, 
29c40 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41 58 50  "-journal", MAXP
29c50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63  ATHLEN);.  strlc
29c60 70 79 28 77 61 6c 50 61 74 68 2c 20 70 46 69 6c  py(walPath, pFil
29c70 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
29c80 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74  HLEN);.  strlcat
29c90 28 77 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22  (walPath, "-wal"
29ca0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
29cb0 20 69 6e 74 20 66 64 31 20 3d 20 70 46 69 6c 65   int fd1 = pFile
29cc0 2d 3e 68 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c  ->h;.  int resul
29cd0 74 20 3d 20 30 3b 0a 20 20 72 65 73 75 6c 74 20  t = 0;.  result 
29ce0 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 31 2c  = ftruncate(fd1,
29cf0 20 30 6c 6c 29 3b 0a 20 20 69 66 20 28 72 65 73   0ll);.  if (res
29d00 75 6c 74 29 20 7b 0a 20 20 20 20 72 65 73 75 6c  ult) {.    resul
29d10 74 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  t = errno;.  }. 
29d20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20   if (result) {. 
29d30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
29d40 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c  OERR;.    storeL
29d50 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
29d60 72 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 0a  result);.  }.  .
29d70 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
29d80 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 4f 5f  (journalPath, O_
29d90 52 44 57 52 29 3b 0a 20 20 69 6e 74 20 72 65 73  RDWR);.  int res
29da0 75 6c 74 32 20 3d 20 30 3b 0a 20 20 69 66 20 28  ult2 = 0;.  if (
29db0 66 64 32 20 3c 20 30 29 20 7b 0a 20 20 20 20 69  fd2 < 0) {.    i
29dc0 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f 45  f (errno != ENOE
29dd0 4e 54 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75  NT) {.      resu
29de0 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  lt2 = errno;.   
29df0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
29e00 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20 20 20  result2 = 0;.   
29e10 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
29e20 20 20 72 65 73 75 6c 74 32 20 3d 20 66 74 72 75    result2 = ftru
29e30 6e 63 61 74 65 28 66 64 32 2c 20 30 6c 6c 29 3b  ncate(fd2, 0ll);
29e40 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 32  .    if (result2
29e50 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ) {.      result
29e60 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  2 = errno;.    }
29e70 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c  .  }.  if (resul
29e80 74 32 20 26 26 20 21 72 65 73 75 6c 74 29 20 7b  t2 && !result) {
29e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29ea0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72  _IOERR;.    stor
29eb0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
29ec0 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a  , result2);.  }.
29ed0 20 20 0a 20 20 69 6e 74 20 66 64 33 20 3d 20 6f    .  int fd3 = o
29ee0 70 65 6e 28 77 61 6c 50 61 74 68 2c 20 4f 5f 52  pen(walPath, O_R
29ef0 44 57 52 29 3b 0a 20 20 69 6e 74 20 72 65 73 75  DWR);.  int resu
29f00 6c 74 33 20 3d 20 30 3b 0a 20 20 69 66 20 28 66  lt3 = 0;.  if (f
29f10 64 33 20 3c 20 30 29 20 7b 0a 20 20 20 20 69 66  d3 < 0) {.    if
29f20 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e   (errno != ENOEN
29f30 54 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  T) {.      resul
29f40 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  t3 = errno;.    
29f50 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
29f60 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20 20 20  esult3 = 0;.    
29f70 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
29f80 20 72 65 73 75 6c 74 33 20 3d 20 66 74 72 75 6e   result3 = ftrun
29f90 63 61 74 65 28 66 64 33 2c 20 30 6c 6c 29 3b 0a  cate(fd3, 0ll);.
29fa0 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 33 29      if (result3)
29fb0 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33   {.      result3
29fc0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
29fd0 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74    }.  if (result
29fe0 33 20 26 26 20 21 28 72 65 73 75 6c 74 20 7c 7c  3 && !(result ||
29ff0 20 72 65 73 75 6c 74 32 29 29 20 7b 0a 20 20 20   result2)) {.   
2a000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2a010 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73  RR;.    storeLas
2a020 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65  tErrno(pFile, re
2a030 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20  sult2);.  }.  . 
2a040 20 69 66 20 28 66 64 33 20 3e 3d 20 30 29 20 7b   if (fd3 >= 0) {
2a050 0a 20 20 20 20 66 73 79 6e 63 28 66 64 33 29 3b  .    fsync(fd3);
2a060 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 33 29 3b  .    close(fd3);
2a070 0a 20 20 7d 0a 20 20 69 66 20 28 66 64 32 20 3e  .  }.  if (fd2 >
2a080 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79 6e 63  = 0) {.    fsync
2a090 28 66 64 32 29 3b 0a 20 20 20 20 63 6c 6f 73 65  (fd2);.    close
2a0a0 28 66 64 32 29 3b 0a 20 20 7d 0a 20 20 66 73 79  (fd2);.  }.  fsy
2a0b0 6e 63 28 66 64 31 29 3b 0a 09 0a 20 20 72 65 74  nc(fd1);...  ret
2a0c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
2a0d0 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
2a0e0 74 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46  teDatabase(unixF
2a0f0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
2a100 62 46 6c 61 67 73 29 20 7b 0a 20 20 73 71 6c 69  bFlags) {.  sqli
2a110 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28  te3_file *id = (
2a120 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70  sqlite3_file *)p
2a130 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
2a140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f   SQLITE_OK;.  vo
2a150 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c  id *pLock = NULL
2a160 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2a170 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74  0;.  int corrupt
2a180 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  FileLock = 0;.  
2a190 69 6e 74 20 69 73 43 6f 72 72 75 70 74 20 3d 20  int isCorrupt = 
2a1a0 30 3b 0a 20 20 69 6e 74 20 66 6f 72 63 65 20 3d  0;.  int force =
2a1b0 20 28 62 46 6c 61 67 73 20 26 20 53 51 4c 49 54   (bFlags & SQLIT
2a1c0 45 5f 54 52 55 4e 43 41 54 45 5f 46 4f 52 43 45  E_TRUNCATE_FORCE
2a1d0 29 3b 0a 20 20 69 6e 74 20 73 61 66 65 46 61 69  );.  int safeFai
2a1e0 6c 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51  led = 0;..#if SQ
2a1f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
2a200 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c  _PROTECTION.  fl
2a210 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72  ags |= pFile->pr
2a220 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a  otFlags;.#endif.
2a230 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2a240 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a250 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63    if( isProxyLoc
2a260 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20  kingMode(pFile) 
2a270 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
2a280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2a290 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  PROXY;.  }.#endi
2a2a0 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  f.  .  rc = sqli
2a2b0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
2a2c0 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  k(pFile->zPath, 
2a2d0 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20  0, flags, 0, 0, 
2a2e0 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72  &pLock);.  if( r
2a2f0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
2a300 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2a310 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
2a320 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73  TADB ){.      is
2a330 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
2a340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64     rc = sqlite3d
2a350 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f  emo_superlock_co
2a360 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54 45  rrupt(id, SQLITE
2a370 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c  _LOCK_EXCLUSIVE,
2a380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3a0 20 20 20 20 20 20 20 20 20 20 26 63 6f 72 72 75            &corru
2a3b0 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20  ptFileLock);.   
2a3c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 26 26   }.    if( rc &&
2a3d0 20 21 66 6f 72 63 65 20 29 7b 0a 20 20 20 20 20   !force ){.     
2a3e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a3f0 7d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  }.    rc = SQLIT
2a400 45 5f 4f 4b 3b 20 2f 2a 20 49 67 6e 6f 72 65 20  E_OK; /* Ignore 
2a410 74 68 65 20 6c 6f 63 6b 69 6e 67 20 66 61 69 6c  the locking fail
2a420 75 72 65 20 69 66 20 66 6f 72 63 65 20 69 73 20  ure if force is 
2a430 74 72 75 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  true */.  }.  if
2a440 28 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45  ( (bFlags&SQLITE
2a450 5f 54 52 55 4e 43 41 54 45 5f 49 4e 49 54 49 41  _TRUNCATE_INITIA
2a460 4c 49 5a 45 5f 48 45 41 44 45 52 5f 4d 41 53 4b  LIZE_HEADER_MASK
2a470 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 69  )!=0 ){.    /* i
2a480 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2a490 64 61 74 61 62 61 73 65 20 69 6e 20 54 4d 50 44  database in TMPD
2a4a0 49 52 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  IR and copy the 
2a4b0 63 6f 6e 74 65 6e 74 73 20 6f 76 65 72 20 2a 2f  contents over */
2a4c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2a4d0 2a 74 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70  *tDir = unixTemp
2a4e0 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 20 20 69  FileDir();.    i
2a4f0 6e 74 20 74 44 69 72 4c 65 6e 20 3d 20 73 74 72  nt tDirLen = str
2a500 6c 65 6e 28 74 44 69 72 29 3b 0a 20 20 20 20 69  len(tDir);.    i
2a510 6e 74 20 74 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  nt tLen = sizeof
2a520 28 63 68 61 72 29 20 2a 20 28 74 44 69 72 4c 65  (char) * (tDirLe
2a530 6e 20 2b 20 31 32 29 3b 0a 20 20 20 20 63 68 61  n + 12);.    cha
2a540 72 20 2a 74 44 62 50 61 74 68 20 3d 20 28 63 68  r *tDbPath = (ch
2a550 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 74 4c 65 6e  ar *)malloc(tLen
2a560 29 3b 0a 20 20 20 20 69 6e 74 20 74 46 64 20 3d  );.    int tFd =
2a570 20 2d 31 3b 0a 20 20 20 20 0a 20 20 20 20 73 74   -1;.    .    st
2a580 72 6c 63 70 79 28 74 44 62 50 61 74 68 2c 20 74  rlcpy(tDbPath, t
2a590 44 69 72 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20  Dir, tLen);.    
2a5a0 69 66 28 20 74 44 62 50 61 74 68 5b 28 74 44 69  if( tDbPath[(tDi
2a5b0 72 4c 65 6e 2d 31 29 5d 20 21 3d 20 27 2f 27 20  rLen-1)] != '/' 
2a5c0 29 7b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74  ){.      strlcat
2a5d0 28 74 44 62 50 61 74 68 2c 20 22 2f 74 6d 70 64  (tDbPath, "/tmpd
2a5e0 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a  bXXXXX", tLen);.
2a5f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2a600 20 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61     strlcat(tDbPa
2a610 74 68 2c 20 22 74 6d 70 64 62 58 58 58 58 58 22  th, "tmpdbXXXXX"
2a620 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  , tLen);.    }. 
2a630 20 20 20 74 46 64 20 3d 20 6d 6b 73 74 65 6d 70     tFd = mkstemp
2a640 28 74 44 62 50 61 74 68 29 3b 0a 20 20 20 20 69  (tDbPath);.    i
2a650 66 28 20 74 46 64 3d 3d 2d 31 20 29 7b 0a 20 20  f( tFd==-1 ){.  
2a660 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
2a670 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
2a680 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2a690 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
2a6a0 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b   safeFailed = 1;
2a6b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a6c0 20 20 73 71 6c 69 74 65 33 20 2a 74 44 62 20 3d    sqlite3 *tDb =
2a6d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 70   NULL;.      cop
2a6e0 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b  yfile_state_t s;
2a6f0 0a 20 20 20 20 20 20 69 6e 74 20 74 72 63 20 3d  .      int trc =
2a700 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
2a710 28 74 44 62 50 61 74 68 2c 20 26 74 44 62 2c 0a  (tDbPath, &tDb,.
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a730 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
2a740 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2a750 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a770 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2a780 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 2c 20 4e  EN_AUTOPROXY), N
2a790 55 4c 4c 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ULL);.      char
2a7a0 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b   *errmsg = NULL;
2a7b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2a7c0 72 20 2a 73 71 6c 20 3d 20 22 22 3b 0a 20 20 20  r *sql = "";.   
2a7d0 20 20 20 69 66 28 20 21 74 72 63 20 26 26 20 28     if( !trc && (
2a7e0 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52  bFlags&SQLITE_TR
2a7f0 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f  UNCATE_PAGESIZE_
2a800 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  MASK) ){.       
2a810 20 63 6f 6e 73 74 20 63 68 61 72 20 70 61 67 65   const char page
2a820 73 69 7a 65 5f 73 71 6c 5b 34 5d 5b 32 32 5d 20  size_sql[4][22] 
2a830 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70  = {.          "p
2a840 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d  ragma page_size=
2a850 31 30 32 34 22 2c 0a 20 20 20 20 20 20 20 20 20  1024",.         
2a860 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69   "pragma page_si
2a870 7a 65 3d 32 30 34 38 22 2c 0a 20 20 20 20 20 20  ze=2048",.      
2a880 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2a890 5f 73 69 7a 65 3d 34 30 39 36 22 2c 0a 20 20 20  _size=4096",.   
2a8a0 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2a8b0 61 67 65 5f 73 69 7a 65 3d 38 31 39 32 22 20 0a  age_size=8192" .
2a8c0 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
2a8d0 20 20 20 69 6e 74 20 69 50 61 67 65 73 69 7a 65     int iPagesize
2a8e0 20 3d 20 28 28 28 62 46 6c 61 67 73 26 53 51 4c   = (((bFlags&SQL
2a8f0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
2a900 45 53 49 5a 45 5f 4d 41 53 4b 29 20 3e 3e 20 34  ESIZE_MASK) >> 4
2a910 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ) - 1);.        
2a920 61 73 73 65 72 74 28 20 69 50 61 67 65 73 69 7a  assert( iPagesiz
2a930 65 3e 3d 30 20 26 26 20 69 50 61 67 65 73 69 7a  e>=0 && iPagesiz
2a940 65 3c 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  e<=4 );.        
2a950 73 71 6c 20 3d 20 70 61 67 65 73 69 7a 65 5f 73  sql = pagesize_s
2a960 71 6c 5b 69 50 61 67 65 73 69 7a 65 5d 3b 0a 20  ql[iPagesize];. 
2a970 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c         trc = sql
2a980 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73  ite3_exec(tDb, s
2a990 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73  ql, 0, 0, &errms
2a9a0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2a9b0 20 20 69 66 28 20 21 74 72 63 20 29 7b 0a 20 20    if( !trc ){.  
2a9c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a9d0 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b   autovacuum_sql[
2a9e0 33 5d 5b 32 31 5d 20 3d 20 7b 0a 20 20 20 20 20  3][21] = {.     
2a9f0 20 20 20 20 20 22 70 72 61 67 6d 61 20 61 75 74       "pragma aut
2aa00 6f 5f 76 61 63 75 75 6d 3d 30 22 2c 0a 20 20 20  o_vacuum=0",.   
2aa10 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 61         "pragma a
2aa20 75 74 6f 5f 76 61 63 75 75 6d 3d 31 22 2c 0a 20  uto_vacuum=1",. 
2aa30 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61           "pragma
2aa40 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 32 22 0a   auto_vacuum=2".
2aa50 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
2aa60 20 20 20 69 6e 74 20 69 41 75 74 6f 76 61 63 75     int iAutovacu
2aa70 75 6d 20 3d 20 32 3b 20 2f 2a 20 64 65 66 61 75  um = 2; /* defau
2aa80 6c 74 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61  lt to incrementa
2aa90 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  l */.        if(
2aaa0 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f   (bFlags&SQLITE_
2aab0 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43  TRUNCATE_AUTOVAC
2aac0 55 55 4d 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20  UUM_MASK) ){.   
2aad0 20 20 20 20 20 20 20 69 41 75 74 6f 76 61 63 75         iAutovacu
2aae0 75 6d 20 3d 20 28 28 28 62 46 6c 61 67 73 26 53  um = (((bFlags&S
2aaf0 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41  QLITE_TRUNCATE_A
2ab00 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20  UTOVACUUM_MASK) 
2ab10 3e 3e 20 32 29 20 2d 20 31 29 3b 0a 20 20 20 20  >> 2) - 1);.    
2ab20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2ab30 73 65 72 74 28 20 69 41 75 74 6f 76 61 63 75 75  sert( iAutovacuu
2ab40 6d 3e 3d 30 20 26 26 20 69 41 75 74 6f 76 61 63  m>=0 && iAutovac
2ab50 75 75 6d 3c 3d 32 20 29 3b 0a 20 20 20 20 20 20  uum<=2 );.      
2ab60 20 20 73 71 6c 20 3d 20 61 75 74 6f 76 61 63 75    sql = autovacu
2ab70 75 6d 5f 73 71 6c 5b 69 41 75 74 6f 76 61 63 75  um_sql[iAutovacu
2ab80 75 6d 5d 3b 0a 20 20 20 20 20 20 20 20 74 72 63  um];.        trc
2ab90 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2aba0 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20  tDb, sql, 0, 0, 
2abb0 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  &errmsg);.      
2abc0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74 72 63  }.      if( !trc
2abd0 20 26 26 20 28 62 46 6c 61 67 73 26 53 51 4c 49   && (bFlags&SQLI
2abe0 54 45 5f 54 52 55 4e 43 41 54 45 5f 4a 4f 55 52  TE_TRUNCATE_JOUR
2abf0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 20 29 7b 0a  NALMODE_WAL) ){.
2ac00 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 22 70          sql = "p
2ac10 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ragma journal_mo
2ac20 64 65 3d 77 61 6c 22 3b 0a 20 20 20 20 20 20 20  de=wal";.       
2ac30 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65   trc = sqlite3_e
2ac40 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c  xec(tDb, sql, 0,
2ac50 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20   0, &errmsg);.  
2ac60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ac70 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69  trc ){.        i
2ac80 66 28 20 21 74 44 62 20 29 7b 0a 20 20 20 20 20  f( !tDb ){.     
2ac90 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
2aca0 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
2acb0 6f 70 65 6e 20 74 65 6d 70 20 64 61 74 61 62 61  open temp databa
2acc0 73 65 20 27 25 73 27 20 74 6f 20 72 65 73 65 74  se '%s' to reset
2acd0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 72               "tr
2acf0 75 6e 63 61 74 65 64 20 64 61 74 61 62 61 73 65  uncated database
2ad00 20 25 73 20 77 69 74 68 20 66 6c 61 67 73 20 25   %s with flags %
2ad10 78 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  x: %d\n",.      
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad30 20 20 20 20 20 74 44 62 50 61 74 68 2c 20 70 46       tDbPath, pF
2ad40 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 62 46 6c 61  ile->zPath, bFla
2ad50 67 73 2c 20 74 72 63 29 3b 0a 20 20 20 20 20 20  gs, trc);.      
2ad60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ad70 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2ad80 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65  r, "failed to se
2ad90 74 20 27 25 73 27 20 6f 6e 20 74 72 75 6e 63 61  t '%s' on trunca
2ada0 74 65 64 20 64 61 74 61 62 61 73 65 20 25 73 2c  ted database %s,
2adb0 20 25 64 3a 20 22 0a 20 20 20 20 20 20 20 20 20   %d: ".         
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 2c 20 70 46   "%s\n", sql, pF
2ade0 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 74 72 63 2c  ile->zPath, trc,
2adf0 20 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20   errmsg);.      
2ae00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ae10 20 20 69 66 28 20 74 44 62 20 29 7b 0a 20 20 20    if( tDb ){.   
2ae20 20 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30       int off = 0
2ae30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6d 65 72  ;.        /* mer
2ae40 67 65 20 74 68 65 20 77 61 6c 20 69 6e 74 6f 20  ge the wal into 
2ae50 74 68 65 20 64 62 20 2a 2f 0a 20 20 20 20 20 20  the db */.      
2ae60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2ae70 6f 6e 74 72 6f 6c 28 74 44 62 2c 20 4e 55 4c 4c  ontrol(tDb, NULL
2ae80 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
2ae90 45 52 53 49 53 54 5f 57 41 4c 2c 20 26 6f 66 66  ERSIST_WAL, &off
2aea0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2aeb0 65 33 5f 63 6c 6f 73 65 28 74 44 62 29 3b 0a 20  e3_close(tDb);. 
2aec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 20 3d       }.      s =
2aed0 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
2aee0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c  alloc();.      l
2aef0 73 65 65 6b 28 74 46 64 2c 20 30 2c 20 53 45 45  seek(tFd, 0, SEE
2af00 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73  K_SET);.      ls
2af10 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c  eek(pFile->h, 0,
2af20 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
2af30 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
2af40 74 46 64 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  tFd, pFile->h, s
2af50 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29  , COPYFILE_DATA)
2af60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2af70 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
2af80 20 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b     switch(err) {
2af90 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
2afa0 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
2afb0 20 20 20 20 74 72 63 20 3d 20 53 51 4c 49 54 45      trc = SQLITE
2afc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2afd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2afe0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2aff0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
2b000 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
2b010 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
2b020 20 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    trc = SQLITE_I
2b030 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
2b040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2b050 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
2b060 65 28 73 29 3b 0a 20 20 20 20 20 20 66 73 79 6e  e(s);.      fsyn
2b070 63 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  c(pFile->h);.   
2b080 20 20 20 63 6c 6f 73 65 28 74 46 64 29 3b 0a 20     close(tFd);. 
2b090 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 44 62 50       unlink(tDbP
2b0a0 61 74 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ath);.      if( 
2b0b0 74 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  trc!=SQLITE_OK )
2b0c0 7b 0a 20 20 20 20 20 20 20 20 73 61 66 65 46 61  {.        safeFa
2b0d0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
2b0e0 20 20 72 63 20 3d 20 74 72 63 3b 0a 20 20 20 20    rc = trc;.    
2b0f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
2b100 65 65 28 74 44 62 50 61 74 68 29 3b 0a 20 20 7d  ee(tDbPath);.  }
2b110 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 63 20 3d   else {.    rc =
2b120 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
2b130 3e 78 54 72 75 6e 63 61 74 65 28 69 64 2c 20 0a  >xTruncate(id, .
2b140 20 20 20 20 20 20 20 20 20 20 20 28 28 70 46 69             ((pFi
2b150 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
2b160 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2b170 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f 20 31  MSDOS) != 0) ? 1
2b180 4c 20 3a 20 30 4c 29 3b 0a 20 20 20 20 69 66 28  L : 0L);.    if(
2b190 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 61 66   rc ){.      saf
2b1a0 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2b1b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2b1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 6f  =SQLITE_OK || fo
2b1d0 72 63 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rce ){.    rc = 
2b1e0 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75  unixInvalidateSu
2b1f0 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65  pportFiles(pFile
2b200 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2b210 20 29 7b 0a 20 20 20 20 20 20 73 61 66 65 46 61   ){.      safeFa
2b220 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
2b230 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65    }.  pFile->pMe
2b240 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20  thod->xSync(id, 
2b250 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
2b260 29 3b 0a 0a 0a 20 20 69 66 28 20 69 73 43 6f 72  );...  if( isCor
2b270 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rupt ){.    sqli
2b280 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
2b290 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
2b2a0 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29  corruptFileLock)
2b2b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  ;.  }else if( pL
2b2c0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
2b2d0 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
2b2e0 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  ck(pLock);.  }el
2b2f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 66  se{.    assert(f
2b300 6f 72 63 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  orce);.  }.  .  
2b310 69 66 28 20 66 6f 72 63 65 20 26 26 20 73 61 66  if( force && saf
2b320 65 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 72 63  eFailed){.    rc
2b330 20 3d 20 75 6e 69 78 55 6e 73 61 66 65 54 72 75   = unixUnsafeTru
2b340 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 70 46  ncateDatabase(pF
2b350 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72  ile);.  }.  .  r
2b360 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b370 20 2a 2a 20 4c 6f 63 6b 20 6c 6f 63 61 74 69 6f   ** Lock locatio
2b380 6e 73 20 66 6f 72 20 73 68 61 72 65 64 2d 6d 65  ns for shared-me
2b390 6d 6f 72 79 20 6c 6f 63 6b 73 20 75 73 65 64 20  mory locks used 
2b3a0 62 79 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 2a 2f  by WAL mode.. */
2b3b0 0a 23 69 66 6e 64 65 66 20 53 48 4d 5f 42 41 53  .#ifndef SHM_BAS
2b3c0 45 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 42  E.# define SHM_B
2b3d0 41 53 45 20 20 20 20 20 20 20 20 20 20 31 32 30  ASE          120
2b3e0 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 57 52  .# define SHM_WR
2b3f0 49 54 45 20 20 20 20 20 20 20 20 20 53 48 4d 5f  ITE         SHM_
2b400 42 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53 48  BASE.# define SH
2b410 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20 20 20 20  M_CHECKPOINT    
2b420 28 53 48 4d 5f 42 41 53 45 2b 31 29 0a 23 20 64  (SHM_BASE+1).# d
2b430 65 66 69 6e 65 20 53 48 4d 5f 52 45 43 4f 56 45  efine SHM_RECOVE
2b440 52 20 20 20 20 20 20 20 28 53 48 4d 5f 42 41 53  R       (SHM_BAS
2b450 45 2b 32 29 0a 23 20 64 65 66 69 6e 65 20 53 48  E+2).# define SH
2b460 4d 5f 52 45 41 44 5f 46 49 52 53 54 20 20 20 20  M_READ_FIRST    
2b470 28 53 48 4d 5f 42 41 53 45 2b 33 29 0a 23 20 64  (SHM_BASE+3).# d
2b480 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 53  efine SHM_READ_S
2b490 49 5a 45 20 20 20 20 20 35 0a 23 65 6e 64 69 66  IZE     5.#endif
2b4a0 20 2f 2a 20 53 48 4d 5f 42 41 53 45 20 2a 2f 0a   /* SHM_BASE */.
2b4b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 65 73 74  ./*.** This test
2b4c0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
2b4d0 6c 6f 63 6b 20 74 65 73 74 69 6e 67 20 6f 6e 20  lock testing on 
2b4e0 75 6e 69 78 2f 70 6f 73 69 78 20 56 46 53 2e 0a  unix/posix VFS..
2b4f0 2a 2a 20 41 64 61 70 74 65 64 20 66 72 6f 6d 20  ** Adapted from 
2b500 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e 63 20 66  tool/getlock.c f
2b510 34 63 33 39 62 36 35 31 33 37 30 31 35 36 63 61  4c39b651370156ca
2b520 65 39 37 39 35 30 31 61 37 62 31 35 36 62 64 62  e979501a7b156bdb
2b530 61 35 30 65 37 63 65 0a 2a 2f 0a 73 74 61 74 69  a50e7ce.*/.stati
2b540 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74  c int unixLockst
2b550 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65 20  atePid(unixFile 
2b560 2a 70 46 69 6c 65 2c 20 70 69 64 5f 74 20 70 69  *pFile, pid_t pi
2b570 64 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b 73 74 61  d, int *pLocksta
2b580 74 65 29 7b 0a 20 20 69 6e 74 20 68 44 62 3b 20  te){.  int hDb; 
2b590 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2b5a0 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2b5b0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
2b5c0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53  file */.  int hS
2b5d0 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20 46 69 6c  hm = -1;  /* Fil
2b5e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2b5f0 20 57 41 4c 20 73 68 61 72 65 64 2d 6d 65 6d 6f   WAL shared-memo
2b600 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 73 73 69  ry file */.  ssi
2b610 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f 2a 20  ze_t got;    /* 
2b620 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  Bytes read from 
2b630 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
2b640 69 73 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  isWal = 0;      
2b650 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b660 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  f in WAL mode */
2b670 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30  .  int nLock = 0
2b680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b690 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
2b6a0 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
2b6b0 6f 48 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20  oHdr = 0;       
2b6c0 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 62 79        /* Zero by
2b6d0 74 65 20 44 42 20 68 61 73 20 6e 6f 20 68 65 61  te DB has no hea
2b6e0 64 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  der */.  unsigne
2b6f0 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
2b700 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
2b710 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a 20 20 61  header */.  .  a
2b720 73 73 65 72 74 28 70 4c 6f 63 6b 73 74 61 74 65  ssert(pLockstate
2b730 29 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61 6b 65 20  );.  .  /* make 
2b740 73 75 72 65 20 77 65 20 61 72 65 20 64 65 61 6c  sure we are deal
2b750 69 6e 67 20 77 69 74 68 20 61 20 64 61 74 61 62  ing with a datab
2b760 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 68 44  ase file */.  hD
2b770 62 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  b = pFile->h;.  
2b780 69 66 28 20 68 44 62 3c 30 20 29 7b 0a 20 20 20  if( hDb<0 ){.   
2b790 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53   *pLockstate = S
2b7a0 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
2b7b0 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2b7c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2b7d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 73    }.  assert( (s
2b7e0 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 46 49 4c  trlen(SQLITE_FIL
2b7f0 45 5f 48 45 41 44 45 52 29 2b 31 29 3d 3d 53 51  E_HEADER)+1)==SQ
2b800 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2b810 5f 4c 45 4e 20 29 3b 0a 20 20 67 6f 74 20 3d 20  _LEN );.  got = 
2b820 70 72 65 61 64 28 68 44 62 2c 20 61 48 64 72 2c  pread(hDb, aHdr,
2b830 20 31 30 30 2c 20 30 29 3b 0a 20 20 69 66 28 20   100, 0);.  if( 
2b840 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c  got<0 ){.    *pL
2b850 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2b860 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f  E_LOCKSTATE_ERRO
2b870 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  R;.    return SQ
2b880 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2b890 20 20 69 66 28 20 67 6f 74 3d 3d 30 20 29 7b 0a    if( got==0 ){.
2b8a0 20 20 20 20 6e 6f 48 64 72 20 3d 20 31 3b 0a 20      noHdr = 1;. 
2b8b0 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 21 3d   }else if( got!=
2b8c0 31 30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  100.         || 
2b8d0 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20 53 51 4c  memcmp(aHdr, SQL
2b8e0 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 2c  ITE_FILE_HEADER,
2b8f0 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41   SQLITE_FILE_HEA
2b900 44 45 52 5f 4c 45 4e 29 21 3d 30 0a 20 20 29 7b  DER_LEN)!=0.  ){
2b910 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
2b920 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2b930 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ATE_NOTADB;.    
2b940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b950 54 41 44 42 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  TADB;.  }.  .  /
2b960 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 66 6f  * First check fo
2b970 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
2b980 6f 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63 6b 20 2b  ock */.  nLock +
2b990 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70  = unixIsLocked(p
2b9a0 69 64 2c 20 68 44 62 2c 20 46 5f 52 44 4c 43 4b  id, hDb, F_RDLCK
2b9b0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
2b9c0 53 48 41 52 45 44 5f 53 49 5a 45 2c 0a 20 20 20  SHARED_SIZE,.   
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 20 20 20 20 22 45 58 43 4c 55 53 49 56 45 22       "EXCLUSIVE"
2b9f0 29 3b 0a 20 20 69 66 20 28 21 6e 6f 48 64 72 29  );.  if (!noHdr)
2ba00 20 7b 0a 20 20 20 20 69 73 57 61 6c 20 3d 20 61   {.    isWal = a
2ba10 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20 20 7d 0a  Hdr[18]==2;.  }.
2ba20 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26    if( nLock==0 &
2ba30 26 20 69 73 57 61 6c 3d 3d 30 20 29 7b 0a 20 20  & isWal==0 ){.  
2ba40 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f    /* Rollback mo
2ba50 64 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20  de */.    nLock 
2ba60 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28  += unixIsLocked(
2ba70 70 69 64 2c 20 68 44 62 2c 20 46 5f 57 52 4c 43  pid, hDb, F_WRLC
2ba80 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  K, PENDING_BYTE,
2ba90 20 53 48 41 52 45 44 5f 53 49 5a 45 2b 32 2c 0a   SHARED_SIZE+2,.
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bab0 20 20 20 20 20 20 20 20 20 20 22 50 45 4e 44 49            "PENDI
2bac0 4e 47 7c 52 45 53 45 52 56 45 44 7c 53 48 41 52  NG|RESERVED|SHAR
2bad0 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ED");.  }.  if( 
2bae0 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61  nLock==0 && isWa
2baf0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  l!=0 ){.    /* l
2bb00 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c 65 20 64  ookup the file d
2bb10 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2bb20 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2bb30 66 69 6c 65 20 69 66 20 77 65 20 68 61 76 65 20  file if we have 
2bb40 69 74 20 6f 70 65 6e 0a 20 20 20 20 2a 2a 20 69  it open.    ** i
2bb50 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  n this process *
2bb60 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
2bb70 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
2bb80 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
2bb90 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
2bba0 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20  s threads */.   
2bbb0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
2bbc0 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  hmNode = pFile->
2bbd0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
2bbe0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
2bbf0 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
2bc00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2bc10 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2bc20 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 68  ;.      .      h
2bc30 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  Shm = pShmNode->
2bc40 68 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68  h;.      if( hSh
2bc50 6d 20 3e 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  m >= 0){.       
2bc60 20 69 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65   if( unixIsLocke
2bc70 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52  d(pid, hShm, F_R
2bc80 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45  DLCK, SHM_RECOVE
2bc90 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56  R, 1, "WAL-RECOV
2bca0 45 52 59 22 29 20 7c 7c 0a 20 20 20 20 20 20 20  ERY") ||.       
2bcb0 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64      unixIsLocked
2bcc0 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44  (pid, hShm, F_RD
2bcd0 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20  LCK, SHM_WRITE, 
2bce0 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29 20  1, "WAL-WRITE") 
2bcf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ){.          nLo
2bd00 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
2bd10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2bd20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
2bd30 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2bd40 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
2bd50 20 7d 20 0a 20 20 20 20 0a 20 20 20 20 69 66 28   } .    .    if(
2bd60 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20   hShm<0 ){.     
2bd70 20 2f 2a 20 74 68 65 20 73 68 61 72 65 64 20 6d   /* the shared m
2bd80 65 6d 6f 72 79 20 66 69 6c 65 20 69 73 6e 27 74  emory file isn't
2bd90 20 6f 70 65 6e 20 69 6e 20 74 68 69 73 20 70 72   open in this pr
2bda0 6f 63 65 73 73 20 73 70 61 63 65 2c 20 6f 70 65  ocess space, ope
2bdb0 6e 20 6f 75 72 0a 20 20 20 20 20 20 2a 2a 20 6f  n our.      ** o
2bdc0 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20 20 20 63  wn FD */.      c
2bdd0 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50 41 54 48  har zShm[MAXPATH
2bde0 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a 20 20 20  LEN];.      .   
2bdf0 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64 65 20 2a     /* WAL mode *
2be00 2f 0a 20 20 20 20 20 20 73 74 72 6c 63 70 79 28  /.      strlcpy(
2be10 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  zShm, pFile->zPa
2be20 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2be30 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 7a  .      strlcat(z
2be40 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20 4d 41 58  Shm, "-shm", MAX
2be50 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2be60 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a 53 68 6d  hShm = open(zShm
2be70 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
2be80 20 20 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30        if( hShm<0
2be90 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 6f   ){.        *pLo
2bea0 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
2beb0 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a  _LOCKSTATE_OFF;.
2bec0 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76          unixLeav
2bed0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
2bee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bef0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2bf00 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b    if( unixIsLock
2bf10 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f  ed(pid, hShm, F_
2bf20 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56  RDLCK, SHM_RECOV
2bf30 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f  ER, 1, "WAL-RECO
2bf40 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20 20 20  VERY") ||.      
2bf50 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28     unixIsLocked(
2bf60 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c  pid, hShm, F_RDL
2bf70 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20 31  CK, SHM_WRITE, 1
2bf80 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29 20 29  , "WAL-WRITE") )
2bf90 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20  {.        nLock 
2bfa0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2bfb0 20 20 20 63 6c 6f 73 65 28 68 53 68 6d 29 3b 0a     close(hShm);.
2bfc0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2bfd0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2bfe0 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30 20 29 7b    if( nLock>0 ){
2bff0 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
2c000 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2c010 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65 6c 73 65  ATE_ON;.  } else
2c020 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61   {.    *pLocksta
2c030 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2c040 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 7d 0a 20  STATE_OFF;.  }. 
2c050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c060 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
2c070 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
2c080 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
2c090 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2c0a0 29 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65  ) */..../*.** He
2c0b0 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
2c0c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
2c0d0 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
2c0e0 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
2c0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c100 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
2c110 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
2c120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2c140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
2c190 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2c1a0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
2c1b0 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
2c1c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2c1d0 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
2c1e0 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
2c1f0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
2c200 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
2c210 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
2c220 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
2c230 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
2c240 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2c250 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
2c260 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
2c270 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
2c280 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2c290 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
2c2a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c2b0 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
2c2c0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
2c2d0 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
2c2e0 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
2c2f0 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
2c300 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
2c310 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
2c320 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
2c330 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
2c340 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
2c350 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2c360 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
2c370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2c380 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
2c390 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
2c3a0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2c3b0 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
2c3c0 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
2c3d0 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
2c3e0 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
2c3f0 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
2c400 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
2c410 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
2c420 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
2c430 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20   finder-funtion 
2c440 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
2c450 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
2c460 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
2c470 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
2c480 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
2c490 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
2c4a0 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
2c4b0 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
2c4c0 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
2c4d0 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
2c4e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
2c4f0 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
2c500 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
2c510 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
2c520 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
2c530 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
2c540 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
2c550 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
2c560 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
2c570 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
2c580 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
2c590 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
2c5a0 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
2c5b0 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
2c5c0 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
2c5d0 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
2c5e0 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
2c5f0 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
2c600 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
2c610 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
2c620 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c630 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
2c640 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
2c650 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
2c660 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
2c670 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
2c680 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
2c690 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
2c6a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
2c6b0 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
2c6c0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2c6d0 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
2c6e0 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
2c6f0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
2c700 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
2c710 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
2c720 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52  DER, METHOD, VER
2c730 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43  SION, CLOSE, LOC
2c740 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43  K, UNLOCK, CKLOC
2c750 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63  K)      \.static
2c760 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2c770 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
2c780 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7a0 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
2c7b0 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
2c7c0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2c7d0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
2c800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c810 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2c820 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
2c850 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
2c860 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
2c870 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
2c8a0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2c8b0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
2c8c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
2c8f0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
2c900 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
2c910 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c930 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c950 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
2c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c980 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
2c990 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
2c9a0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
2c9b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9f0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2ca20 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2ca70 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ca90 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2caa0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2cac0 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
2cad0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
2cae0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2cb10 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb30 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2cb60 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
2cb70 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
2cb80 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
2cb90 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
2cba0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2cbb0 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  nixShmMap,      
2cbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2cbd0 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2cc00 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
2cc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2cc20 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2cc50 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
2cc60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2cc70 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2cca0 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20  ShmUnmap        
2ccb0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
2ccc0 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd30 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2cd40 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2cd50 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
2cd60 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
2cd70 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
2cd80 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
2cd90 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
2cda0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
2cdb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
2cde0 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2ce80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2ce90 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
2cea0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
2ceb0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
2cec0 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
2ced0 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
2cee0 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
2cef0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2cf00 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
2cf10 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
2cf20 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2cf30 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
2cf40 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
2cf50 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
2cf60 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
2cf70 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
2cf80 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
2cf90 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2cfa0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2cfb0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2cfc0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
2cfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2cfe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2cff0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2d000 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
2d010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2d020 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65  ared memory is e
2d030 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  nabled */.  unix
2d040 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2d050 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2d060 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2d070 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2d080 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2d090 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
2d0a0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2d0b0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2d0c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2d0d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2d0e0 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k     /* xCheckR
2d0f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2d100 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2d110 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
2d120 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
2d130 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2d140 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
2d150 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2d160 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2d170 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2d180 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1a0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2d1b0 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
2d1c0 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
2d1d0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2d1e0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2d1f0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
2d200 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2d210 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2d220 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
2d230 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2d240 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2d250 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
2d260 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2d270 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2d280 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2d290 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
2d2a0 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
2d2b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
2d2c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2d2d0 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
2d2e0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2d2f0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2d300 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2d310 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2d340 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2d350 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
2d360 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2d370 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2d380 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
2d390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d3a0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2d3b0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
2d3c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
2d3d0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2d3e0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
2d3f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f  kReservedLock  /
2d400 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2d410 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
2d420 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2d430 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d440 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
2d450 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
2d460 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2d470 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2d480 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2d490 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
2d4a0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2d4b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2d4c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2d4d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2d500 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2d510 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
2d520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2d530 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2d540 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
2d550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2d560 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2d570 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
2d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2d590 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2d5a0 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
2d5b0 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
2d5c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2d5d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
2d5e0 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
2d5f0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
2d600 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
2d610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d620 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2d630 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
2d640 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2d650 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2d660 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2d670 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d690 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2d6a0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2d6b0 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2d6e0 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2d710 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d730 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2d740 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
2d750 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
2d760 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2d770 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2d780 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2d790 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2d7a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2d7b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2d7c0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
2d7d0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2d7e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2d7f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2d800 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
2d810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2d820 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2d830 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2d840 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d860 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2d870 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2d880 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
2d890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2d8a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2d8b0 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
2d8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2d8d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2d8e0 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
2d8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2d900 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2d910 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
2d920 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
2d930 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2d940 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2d950 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
2d960 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
2d970 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
2d980 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
2d990 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
2d9a0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
2d9b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2d9c0 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
2d9d0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
2d9e0 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
2d9f0 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
2da00 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
2da10 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2da20 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
2da30 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
2da40 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
2da50 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
2da60 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
2da70 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
2da80 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
2da90 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
2daa0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
2dab0 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
2dac0 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
2dad0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2dae0 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
2daf0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
2db00 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
2db10 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
2db20 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
2db30 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
2db40 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2db50 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2db60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2db70 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
2db80 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
2db90 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
2dba0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
2dbb0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2dbc0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2dbd0 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
2dbe0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2dbf0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2dc00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2dc10 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2dc20 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
2dc30 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
2dc40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2dc50 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2dc60 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
2dc70 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
2dc80 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2dc90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2dca0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcc0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2dcd0 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
2dce0 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
2dcf0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2dd00 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2dd10 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
2dd20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2dd30 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2dd40 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
2dd50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2dd60 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2dd70 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
2dd80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
2dd90 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2dda0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2ddb0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
2ddc0 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
2ddd0 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
2dde0 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
2ddf0 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
2de00 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
2de10 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2de20 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2de30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2de40 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
2de50 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
2de60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2de70 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2de80 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
2de90 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
2dea0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2deb0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2dec0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2def0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2df00 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
2df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2df30 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2df60 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df80 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2df90 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
2dfa0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
2dfb0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2dfc0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2dfd0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2dfe0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2dff0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2e000 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e010 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2e020 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2e030 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2e040 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2e050 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2e060 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2e070 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2e080 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2e090 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2e0a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2e0b0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2e0c0 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2e0d0 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2e0e0 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
2e0f0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
2e100 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2e110 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
2e120 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
2e130 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2e140 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2e150 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2e160 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2e170 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2e180 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
2e190 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
2e1a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e1b0 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
2e1c0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
2e1d0 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
2e1e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
2e1f0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
2e200 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
2e210 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
2e220 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2e230 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
2e240 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
2e250 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
2e260 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
2e270 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
2e280 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2e290 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2e2a0 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
2e2b0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2e2c0 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
2e2d0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2e2e0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
2e2f0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2e300 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
2e310 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
2e320 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
2e330 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
2e340 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2e350 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
2e360 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2e370 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2e380 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2e390 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2e3a0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2e3b0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2e3c0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2e3d0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2e3e0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2e3f0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2e400 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2e410 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
2e420 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
2e430 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
2e440 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
2e450 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
2e460 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
2e470 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2e480 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
2e490 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
2e4a0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
2e4b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
2e4c0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
2e4d0 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
2e4e0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
2e4f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
2e500 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
2e510 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
2e520 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
2e530 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
2e540 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
2e550 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
2e560 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
2e570 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
2e580 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
2e590 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
2e5a0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2e5b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
2e5c0 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
2e5d0 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
2e5e0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2e5f0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2e600 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2e610 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2e620 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2e630 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2e640 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2e650 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2e660 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2e670 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2e680 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2e690 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2e6a0 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
2e6b0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
2e6c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
2e6d0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
2e6e0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2e6f0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
2e700 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
2e710 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2e720 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
2e730 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2e740 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
2e750 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
2e760 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2e770 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
2e780 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2e790 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2e7a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2e7b0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2e7c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e7d0 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
2e7e0 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
2e7f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2e800 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
2e810 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2e820 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
2e830 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
2e840 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2e850 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
2e860 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
2e870 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
2e880 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
2e890 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2e8a0 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
2e8b0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
2e8c0 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
2e8d0 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72  his is for VXWor
2e8e0 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ks only..*/.stat
2e8f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2e900 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2e910 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2e920 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2e930 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2e940 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2e950 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e960 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2e970 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
2e980 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2e990 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2e9a0 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2e9b0 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2e9c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2e9d0 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2e9e0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2e9f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2ea00 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2ea10 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2ea20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2ea30 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2ea40 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2ea50 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
2ea60 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
2ea70 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
2ea80 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
2ea90 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
2eaa0 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
2eab0 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
2eac0 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
2ead0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2eae0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2eaf0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2eb00 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2eb10 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2eb20 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2eb30 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2eb40 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2eb50 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2eb60 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2eb70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
2eb80 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2eb90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2eba0 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
2ebb0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2ebc0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2ebd0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2ebe0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2ebf0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2ec00 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2ec10 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2ec20 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2ec30 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
2ec40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ec50 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
2ec60 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
2ec70 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
2ec80 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64  r to a IO method
2ec90 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2eca0 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
2ecb0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2ecc0 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
2ecd0 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
2ece0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
2ecf0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2ed40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
2ed60 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
2ed70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
2ed90 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2eda0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
2edb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
2edc0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
2edd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
2ede0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
2edf0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2ee00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
2ee10 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2ee20 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
2ee30 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
2ee40 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
2ee50 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2ee60 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
2ee70 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2ee80 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eea0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
2eeb0 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
2eec0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2eed0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2eee0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
2eef0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
2ef00 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
2ef10 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2ef20 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2ef30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2ef40 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2ef50 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
2ef60 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
2ef70 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
2ef80 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
2ef90 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2efa0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2efb0 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2efc0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2efd0 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2efe0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2eff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2f000 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2f010 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2f020 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
2f030 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
2f040 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
2f050 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
2f060 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
2f070 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
2f080 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
2f090 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
2f0a0 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
2f0b0 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
2f0c0 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
2f0d0 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
2f0e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2f0f0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2f100 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2f110 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
2f120 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2f130 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2f140 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
2f150 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
2f160 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2f170 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
2f180 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2f190 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2f1a0 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
2f1b0 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
2f1c0 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
2f1d0 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
2f1e0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2f1f0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
2f200 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2f210 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
2f220 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2f230 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2f240 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2f250 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2f260 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
2f270 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
2f280 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
2f290 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
2f2a0 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 20  (u8)ctrlFlags;. 
2f2b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
2f2c0 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46  _boolean(((ctrlF
2f2d0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2f2e0 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65  URI) ? zFilename
2f2f0 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20   : 0),.         
2f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f310 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45    "psow", SQLITE
2f320 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
2f330 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65  RITE) ){.    pNe
2f340 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2f350 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20  UNIXFILE_PSOW;. 
2f360 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
2f370 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
2f380 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29  x-excl",10)==0 )
2f390 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2f3a0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2f3b0 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
2f3c0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
2f3d0 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
2f3e0 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
2f3f0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
2f400 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
2f410 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2f420 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
2f430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f440 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
2f450 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
2f460 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2f470 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
2f480 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
2f490 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2f4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
2f4b0 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
2f4c0 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
2f4d0 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
2f4e0 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
2f4f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f500 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2f510 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
2f520 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
2f530 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
2f540 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
2f550 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
2f560 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
2f570 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
2f580 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
2f590 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
2f5a0 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
2f5b0 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
2f5c0 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
2f5d0 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
2f5e0 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
2f5f0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2f600 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
2f610 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
2f620 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
2f630 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
2f640 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
2f650 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2f660 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2f670 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f680 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
2f690 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
2f6a0 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 20 20  hods.#endif.    
2f6b0 20 2f 2a 20 73 75 70 70 6f 72 74 20 57 41 4c 20   /* support WAL 
2f6c0 6d 6f 64 65 20 6f 6e 20 72 65 61 64 20 6f 6e 6c  mode on read onl
2f6d0 79 20 6d 6f 75 6e 74 65 64 20 66 69 6c 65 73 79  y mounted filesy
2f6e0 73 74 65 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20 70  stem */.    || p
2f6f0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2f700 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2f710 20 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45   .  ){.    unixE
2f720 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2f730 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2f740 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2f750 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2f760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f770 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
2f780 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
2f790 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
2f7a0 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
2f7b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
2f7c0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
2f7d0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
2f7e0 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
2f7f0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
2f800 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
2f810 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
2f820 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
2f830 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
2f840 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
2f850 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
2f860 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
2f870 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
2f880 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
2f890 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
2f8a0 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
2f8b0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
2f8c0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
2f8d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2f8e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2f8f0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2f900 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
2f910 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
2f920 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
2f930 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
2f940 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
2f950 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2f960 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2f970 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2f980 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
2f990 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
2f9a0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
2f9b0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
2f9c0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
2f9d0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
2f9e0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
2f9f0 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
2fa00 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
2fa10 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
2fa20 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
2fa30 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
2fa40 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
2fa50 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
2fa60 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
2fa70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
2fa80 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
2fa90 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
2faa0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
2fab0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
2fac0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
2fad0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
2fae0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
2faf0 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
2fb00 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2fb10 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2fb20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
2fb30 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2fb40 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
2fb50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2fb60 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2fb70 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2fb80 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2fb90 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
2fba0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2fbb0 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
2fbc0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2fbd0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2fbe0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2fbf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
2fc00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
2fc10 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
2fc20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2fc30 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
2fc40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
2fc50 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2fc60 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
2fc70 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2fc80 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2fc90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2fca0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fcb0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2fcc0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2fcd0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2fce0 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2fcf0 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2fd00 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2fd10 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2fd20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2fd30 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2fd40 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2fd50 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2fd60 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2fd70 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2fd80 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2fd90 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2fda0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2fdb0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2fdc0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2fdd0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2fde0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2fdf0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2fe00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fe10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2fe20 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2fe30 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2fe40 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2fe50 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2fe60 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2fe70 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2fe80 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2fe90 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2fea0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2feb0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2fec0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2fed0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2fee0 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2fef0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2ff00 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2ff10 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2ff20 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2ff30 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2ff40 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2ff50 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2ff60 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2ff70 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2ff80 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2ff90 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2ffa0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2ffb0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2ffc0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2ffd0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2ffe0 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
2fff0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
30000 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
30010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
30020 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
30030 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30040 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
30050 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
30060 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
30070 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
30080 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
30090 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
300a0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
300b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
300c0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
300d0 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
300e0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
300f0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
30100 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
30110 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
30120 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
30130 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
30140 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
30150 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
30160 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
30170 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
30180 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
30190 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
301a0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
301b0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
301c0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
301d0 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
301e0 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
301f0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
30200 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
30210 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
30220 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
30230 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
30240 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30260 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
30270 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
30280 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
30290 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
302a0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
302b0 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
302c0 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
302d0 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
302e0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
302f0 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
30300 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
30310 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
30320 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
30330 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
30340 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
30350 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
30360 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
30370 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
30380 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
30390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
303a0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
303b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
303c0 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
303d0 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
303e0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
303f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
30400 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
30410 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
30420 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
30430 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
30440 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
30450 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30      isDelete = 0
30460 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65  ;.  }.  if( isDe
30470 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74 72  lete ) pNew->ctr
30480 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30490 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  LE_DELETE;.#endi
304a0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
304b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
304c0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
304d0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
304e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
304f0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
30500 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
30510 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
30520 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
30530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30540 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
30550 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
30560 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
30570 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
30580 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
30590 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
305a0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
305b0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
305c0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
305d0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
305e0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
305f0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
30600 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
30610 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
30620 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
30630 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
30640 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
30650 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
30660 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
30670 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
30680 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
30690 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
306a0 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
306b0 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
306c0 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
306d0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
306e0 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
306f0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
30700 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
30710 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
30720 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
30730 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
30740 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
30750 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
30760 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
30770 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
30780 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
30790 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
307a0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
307b0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
307c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
307d0 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
307e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
307f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
30800 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
30810 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
30820 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
30830 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
30840 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
30850 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
30860 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
30870 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
30880 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
30890 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
308a0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
308b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
308c0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
308d0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
308e0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
308f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
30900 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
30910 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
30920 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
30930 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
30940 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
30950 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
30960 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
30970 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
30980 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
30990 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
309a0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
309b0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
309c0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
309d0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
309e0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
309f0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
30a00 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
30a10 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
30a20 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
30a30 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
30a40 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
30a50 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
30a60 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
30a70 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
30a80 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
30a90 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
30aa0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
30ab0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
30ac0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
30ad0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
30ae0 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
30af0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
30b00 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
30b10 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
30b20 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
30b30 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
30b40 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e  _PREFIX) + 18) >
30b50 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
30b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30b70 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
30b80 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
30b90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
30ba0 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  18, zBuf, "%s/"S
30bb0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
30bc0 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
30bd0 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
30be0 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
30bf0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
30c00 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
30c10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
30c20 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
30c30 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
30c40 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
30c50 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
30c60 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
30c70 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
30c80 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
30c90 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20  ;.    zBuf[j+1] 
30ca0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
30cb0 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
30cc0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
30cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
30ce0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30cf0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
30d00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
30d10 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
30d20 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
30d30 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
30d40 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
30d50 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
30d60 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
30d70 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
30d80 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
30d90 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
30da0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
30db0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
30dc0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
30dd0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
30de0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
30df0 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
30e00 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
30e10 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
30e20 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
30e30 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
30e40 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
30e50 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
30e60 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
30e70 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
30e80 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
30e90 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
30ea0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
30eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
30ec0 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
30ed0 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
30ee0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
30ef0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
30f00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
30f10 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
30f20 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
30f30 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
30f40 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
30f50 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
30f60 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
30f70 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
30f80 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
30f90 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
30fa0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
30fb0 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
30fc0 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
30fd0 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
30fe0 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
30ff0 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
31000 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
31010 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
31020 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
31030 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
31040 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
31050 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
31060 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
31070 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
31080 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
31090 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
310a0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
310b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
310c0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
310d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
310e0 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
310f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
31100 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
31110 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
31120 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
31130 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
31140 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
31150 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
31160 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
31170 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
31180 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
31190 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
311a0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
311b0 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
311c0 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
311d0 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
311e0 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
311f0 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
31200 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
31210 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
31220 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
31230 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
31240 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
31250 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
31260 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
31270 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
31280 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
31290 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
312a0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
312b0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
312c0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
312d0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
312e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
312f0 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
31300 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
31310 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
31320 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
31330 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
31340 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
31350 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
31360 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
31370 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
31380 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
31390 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
313a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
313b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
313c0 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
313d0 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
313e0 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
313f0 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
31400 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
31410 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
31420 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
31430 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
31440 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
31450 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
31460 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
31470 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
31480 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
31490 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
314a0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
314b0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
314c0 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
314d0 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
314e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
314f0 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
31500 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  */.  if( 0==osSt
31510 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
31520 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
31530 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
31540 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
31550 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
31560 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
31570 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
31580 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
31590 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
315a0 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
315b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
315c0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
315d0 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
315e0 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
315f0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
31600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31610 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
31620 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
31630 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
31640 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
31650 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
31660 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
31670 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
31680 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
31690 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
316a0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
316b0 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
316c0 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
316d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
316e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
316f0 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
31700 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
31710 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
31720 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
31730 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31740 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
31750 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
31760 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
31770 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
31780 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
31790 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
317a0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
317b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
317c0 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
317d0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
317e0 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
317f0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
31800 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
31810 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
31820 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
31830 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
31840 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
31850 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
31860 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
31870 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
31880 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
31890 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20 74  t cases cases, t
318a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
318b0 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
318c0 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
318d0 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
318e0 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
318f0 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
31900 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
31910 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
31920 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
31930 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
31940 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
31950 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
31960 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
31970 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
31980 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
31990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
319a0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
319b0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
319c0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
319d0 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
319e0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
319f0 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
31a00 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
31a10 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
31a20 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
31a30 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
31a40 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
31a50 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
31a60 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
31a70 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
31a80 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
31a90 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
31aa0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
31ab0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
31ac0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
31ad0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
31ae0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
31af0 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
31b00 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
31b10 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
31b20 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
31b30 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
31b40 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
31b50 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
31b60 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
31b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
31b80 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
31b90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31ba0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
31bb0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
31bc0 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
31bd0 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
31be0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
31c10 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
31c20 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
31c30 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
31c60 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
31c70 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
31c80 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
31c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
31ca0 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
31cb0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
31cc0 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
31cf0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
31d00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
31d10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31d20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31d30 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
31d40 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
31d50 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
31d60 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
31d70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
31d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31d90 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
31da0 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
31db0 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
31dc0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
31dd0 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
31de0 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
31df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31e00 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
31e10 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20  es in zDb */.   
31e20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
31e30 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  at;            /
31e40 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74  * Output of stat
31e50 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  () on database f
31e60 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  ile */..    /* z
31e70 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
31e80 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
31e90 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
31ea0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
31eb0 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
31ec0 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
31ed0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
31ee0 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
31ef0 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
31f00 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
31f10 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
31f20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
31f30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
31f40 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
31f50 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
31f60 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
31f70 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
31f80 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
31f90 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
31fa0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
31fb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
31fc0 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
31fd0 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
31fe0 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
31ff0 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
32000 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
32010 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
32020 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
32030 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
32040 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
32050 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
32060 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a  NABLE_8_3_NAMES.
32070 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30      while( nDb>0
32080 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e   && sqlite3Isaln
32090 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29  um(zPath[nDb]) )
320a0 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20   nDb--;.    if( 
320b0 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  nDb==0 || zPath[
320c0 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  nDb]!='-' ) retu
320d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
320e0 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  lse.    while( z
320f0 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
32100 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32110 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  nDb>0 );.      a
32120 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62  ssert( zPath[nDb
32130 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20  ]!='\n' );.     
32140 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65   nDb--;.    }.#e
32150 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28  ndif.    memcpy(
32160 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
32170 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
32180 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
32190 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26  0==osStat(zDb, &
321a0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
321b0 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
321c0 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
321d0 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74       *pUid = sSt
321e0 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20  at.st_uid;.     
321f0 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
32200 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65  t_gid;.    }else
32210 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
32220 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
32230 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
32240 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
32250 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
32260 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  LOSE ){.    *pMo
32270 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20  de = 0600;.  }. 
32280 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32290 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
322a0 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
322b0 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
322c0 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
322d0 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
322e0 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
322f0 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
32300 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
32310 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
32320 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
32330 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
32340 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
32350 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
32360 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
32370 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
32380 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
32390 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
323a0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
323b0 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
323c0 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
323d0 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
323e0 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
323f0 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
32400 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
32410 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
32420 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
32430 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
32440 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
32450 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
32460 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
32470 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
32480 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
32490 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
324a0 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
324b0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
324c0 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
324d0 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
324e0 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
324f0 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
32500 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
32510 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
32520 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
32530 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
32540 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
32550 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
32560 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
32570 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
32580 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
32590 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
325a0 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
325b0 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
325c0 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
325d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
325e0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
325f0 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
32600 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
32610 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
32620 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
32630 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
32640 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
32650 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
32660 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
32670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32680 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
32690 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
326a0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
326b0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
326c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
326d0 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
326e0 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
326f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
32700 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
32710 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
32720 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
32730 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
32740 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
32750 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
32760 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
32770 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
32780 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
32790 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69   to open() */.#i
327a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
327b0 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
327c0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
327d0 61 67 73 26 30 78 46 46 30 46 46 46 30 30 3b 20  ags&0xFF0FFF00; 
327e0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
327f0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73   to open */.#els
32800 65 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  e.  int eType = 
32810 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
32820 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
32830 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
32840 6e 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  ndif.  int noLoc
32850 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
32860 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
32870 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
32880 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
32890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
328a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
328b0 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
328c0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74  Code */.  int ct
328d0 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  rlFlags = 0;    
328e0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58           /* UNIX
328f0 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
32900 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
32910 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
32920 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
32930 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
32940 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
32950 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
32960 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
32970 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
32980 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
32990 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
329a0 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
329b0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
329c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
329d0 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
329e0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
329f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
32a00 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
32a10 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
32a20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
32a30 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
32a40 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
32a50 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
32a60 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
32a70 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32a80 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
32a90 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32aa0 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
32ab0 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
32ac0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
32ad0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
32ae0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
32af0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
32b00 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
32b10 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
32b20 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
32b30 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
32b40 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
32b50 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
32b60 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
32b70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
32b80 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
32b90 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
32ba0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
32bb0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
32bc0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
32bd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
32be0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
32bf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
32c00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32c10 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
32c20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
32c30 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
32c40 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
32c50 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
32c60 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
32c70 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
32c80 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
32c90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
32ca0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
32cb0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
32cc0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
32cd0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
32ce0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
32cf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
32d00 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
32d10 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
32d20 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
32d30 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
32d40 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
32d50 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
32d60 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
32d70 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
32d80 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
32d90 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
32da0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
32db0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
32dc0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
32dd0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
32de0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
32df0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
32e00 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
32e10 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
32e20 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
32e30 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
32e40 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
32e50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
32e60 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
32e70 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
32e80 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
32e90 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
32ea0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
32eb0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
32ec0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
32ed0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
32ee0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
32ef0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
32f00 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
32f10 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
32f20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
32f30 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
32f40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
32f50 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
32f60 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
32f70 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
32f80 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
32f90 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
32fa0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
32fb0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
32fc0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
32fd0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
32fe0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
32ff0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
33000 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
33010 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
33020 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
33030 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
33040 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
33050 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
33060 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
33070 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
33080 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
33090 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
330a0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
330b0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
330c0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
330d0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
330e0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
330f0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
33100 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
33110 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
33120 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
33130 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
33140 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
33150 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
33160 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
33170 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
33180 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
33190 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
331a0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
331b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
331c0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
331d0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
331e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
331f0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
33200 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
33210 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
33220 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
33230 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
33240 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
33250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
33260 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
33270 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
33280 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
33290 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
332a0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
332b0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
332c0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
332d0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
332e0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
332f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
33300 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
33310 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
33320 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
33330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33340 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
33350 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
33360 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
33370 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ..    /* Databas
33380 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
33390 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
333a0 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
333b0 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52  re not.    ** UR
333c0 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
333d0 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
333e0 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
333f0 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a  assed into.    *
33400 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
33410 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
33420 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
33430 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
33440 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72  RI) || zName[str
33450 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
33460 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28   );..  }else if(
33470 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
33480 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
33490 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
334a0 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
334b0 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
334c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
334d0 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69  elete && !syncDi
334e0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  r);.    rc = uni
334f0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
33500 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d  _PATHNAME+2, zTm
33510 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
33520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
33540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
33550 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
33560 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
33570 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
33580 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
33590 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
335a0 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
335b0 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
335c0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
335d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
335e0 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
335f0 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
33600 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
33610 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
33620 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
33630 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
33640 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
33650 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
33660 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
33670 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
33680 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
33690 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
336a0 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
336b0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
336c0 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
336d0 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
336e0 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
336f0 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
33700 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
33710 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
33720 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
33730 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
33740 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
33750 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
33760 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
33770 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
33780 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
33790 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
337a0 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
337b0 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
337c0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
337d0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
337e0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  );..#if SQLITE_E
337f0 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
33800 43 54 49 4f 4e 0a 20 20 70 2d 3e 70 72 6f 74 46  CTION.  p->protF
33810 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
33820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
33830 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
33840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
33850 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
33860 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
33870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33880 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
33890 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
338a0 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
338b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
338c0 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
338d0 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
338e0 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
338f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33900 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
33910 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
33920 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
33930 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
33940 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
33950 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
33960 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
33980 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65  sert( !p->pUnuse
33990 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
339a0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
339b0 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
339c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
339d0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
339e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
339f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
33a00 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
33a10 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
33a20 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
33a30 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
33a40 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
33a50 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
33a60 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ags));.    if( f
33a70 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
33a80 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
33a90 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
33aa0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
33ab0 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
33ac0 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
33ad0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
33ae0 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
33af0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
33b00 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
33b10 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
33b20 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
33b30 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
33b40 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
33b50 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
33b60 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
33b70 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
33b80 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
33b90 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61  NLY;.      isRea
33ba0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
33bb0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
33bc0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
33bd0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
33be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
33bf0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
33c00 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
33c10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33c20 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
33c30 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
33c40 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
33c50 20 7d 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65   }..    /* if we
33c60 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  're opening the 
33c70 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61  wal or journal a
33c80 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  nd running as ro
33c90 6f 74 2c 20 73 65 74 20 74 68 65 0a 20 20 20 20  ot, set the.    
33ca0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67  ** journal uid/g
33cb0 69 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  id */.    if( !i
33cc0 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 28 66 6c  sReadonly && (fl
33cd0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
33ce0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
33cf0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
33d00 29 20 29 7b 0a 20 20 20 20 20 20 75 69 64 5f 74  ) ){.      uid_t
33d10 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
33d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 75 69  );.      if( eui
33d30 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75  d==0 && (euid!=u
33d40 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21  id || getegid()!
33d50 3d 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  =gid) ){.       
33d60 20 69 66 28 20 6f 73 46 63 68 6f 77 6e 28 66 64   if( osFchown(fd
33d70 2c 20 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20  , uid, gid) ){. 
33d80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33d90 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33da0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
33db0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
33dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
33de0 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
33df0 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
33e00 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
33e10 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
33e20 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
33e30 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
33e40 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
33e50 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
33e60 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
33e70 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
33e80 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
33e90 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
33ea0 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
33eb0 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
33ec0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
33ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33ee0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
33ef0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
33f00 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  ).  else{.    p-
33f10 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
33f20 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
33f30 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
33f40 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
33f50 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
33f60 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
33f70 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
33f80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33f90 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
33fa0 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
33fb0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f  == -1 ){.    sto
33fc0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65  reLastErrno(p, e
33fd0 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73  rrno);.    robus
33fe0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
33ff0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
34000 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
34010 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
34020 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
34030 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
34040 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
34050 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
34060 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
34070 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
34080 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
34090 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
340a0 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c  strncmp("exfat",
340b0 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
340c0 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
340d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
340e0 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
340f0 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
34100 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
34110 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
34120 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
34130 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
34140 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
34150 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
34160 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
34170 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
34180 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
34190 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
341a0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
341b0 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  NLY;.  if( noLoc
341c0 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
341d0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
341e0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
341f0 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
34200 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
34210 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
34220 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
34230 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
34240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
34250 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
34260 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 23 69 66  NIXFILE_URI;.#if
34270 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
34280 45 4e 41 42 4c 45 5f 50 45 52 53 49 53 54 5f 57  ENABLE_PERSIST_W
34290 41 4c 29 0a 20 20 69 66 28 20 65 54 79 70 65 3d  AL).  if( eType=
342a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
342b0 4e 5f 44 42 20 29 20 7b 0a 20 20 20 20 63 74 72  N_DB ) {.    ctr
342c0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
342d0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a  LE_PERSIST_WAL;.
342e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
342f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34300 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
34310 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
34320 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
34330 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
34340 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
34350 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
34360 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
34370 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
34380 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
34390 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
343a0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
343b0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
343c0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
343d0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
343e0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
343f0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
34400 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
34410 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
34420 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
34430 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
34440 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
34450 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
34460 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
34470 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
34480 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
34490 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
344a0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
344b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
344c0 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
344d0 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
344e0 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
344f0 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
34500 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
34510 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
34520 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74   fd, pFile, zPat
34530 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  h, ctrlFlags);. 
34540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34560 20 20 2f 2a 20 63 61 63 68 65 20 74 68 65 20 70    /* cache the p
34570 4d 65 74 68 6f 64 20 69 6e 20 63 61 73 65 20 74  Method in case t
34580 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 66 61 69  he transform fai
34590 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ls */.        co
345a0 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
345b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
345c0 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e  Method = pFile->
345d0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
345e0 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
345f0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
34600 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
34610 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
34620 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34640 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f    /* Use unixClo
34650 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  se to clean up t
34660 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64  he resources add
34670 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  ed in fillInUnix
34680 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  File .          
34690 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c  ** and clear all
346a0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73   the structure's
346b0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70   references.  Sp
346c0 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20  ecifically, .   
346d0 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d         ** pFile-
346e0 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62  >pMethods will b
346f0 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65  e NULL so sqlite
34700 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65  3OsClose will be
34710 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20   a no-op .      
34720 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
34730 20 69 66 28 20 70 4d 65 74 68 6f 64 21 3d 4e 55   if( pMethod!=NU
34740 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
34750 20 20 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73    pMethod->xClos
34760 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
34770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34780 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
34790 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
347a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
347b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
347c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
347d0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
347e0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
347f0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
34800 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
34810 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
34820 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
34830 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
34840 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
34850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
34860 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
34870 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
34880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
34890 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
348a0 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
348b0 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
348c0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
348d0 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
348e0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
348f0 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
34900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
34910 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
34920 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
34930 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
34940 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
34950 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
34960 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
34970 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
34980 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
34990 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
349a0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
349b0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
349c0 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
349d0 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
349e0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
349f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
34a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34a10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34a20 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
34a30 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
34a40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
34a50 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
34a60 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
34a70 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d  =(-1) && errno!=
34a80 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65  ENOENT ){.    re
34a90 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
34aa0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
34ab0 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
34ac0 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66   zPath);.  }.#if
34ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
34ae0 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
34af0 28 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21  ( (dirSync & 1)!
34b00 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  =0 ){.    int fd
34b10 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
34b20 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
34b30 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
34b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34b50 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
34b60 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
34b70 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
34b80 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
34b90 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
34ba0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
34bb0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
34bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
34bd0 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
34be0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
34bf0 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43  #if OSCLOSE_CHEC
34c00 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20  K_CLOSE_IOERR.  
34c10 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
34c20 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
34c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
34c40 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
34c50 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
34c60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
34c70 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
34c80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
34c90 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
34ca0 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
34cb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34cc0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OK;.    }.  }.#e
34cd0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
34ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
34cf0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
34d00 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
34d10 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
34d20 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
34d30 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
34d40 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
34d50 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
34d60 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
34d70 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
34d80 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
34d90 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
34da0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
34db0 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
34dc0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
34dd0 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
34de0 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
34df0 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
34e00 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
34e10 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
34e20 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
34e30 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
34e40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
34e50 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
34e60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
34e70 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
34e80 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
34e90 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
34ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
34eb0 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
34ec0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
34ed0 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
34ee0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
34ef0 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
34f00 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
34f10 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
34f20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
34f30 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
34f40 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
34f50 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
34f60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
34f70 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
34f80 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34f90 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
34fa0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
34fb0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
34fc0 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
34fd0 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
34fe0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
34ff0 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
35000 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
35010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
35020 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
35030 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
35040 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
35050 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
35060 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
35070 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
35080 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
35090 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
350a0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
350b0 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
350c0 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
350d0 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
350e0 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73  sOut = (osAccess
350f0 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
35100 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  0);.  if( flags=
35110 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
35120 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75  XISTS && *pResOu
35130 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
35140 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
35150 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
35160 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e  h, &buf) && buf.
35170 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  st_size==0 ){.  
35180 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30      *pResOut = 0
35190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
351a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
351b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
351c0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
351d0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
351e0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
351f0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
35200 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
35210 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
35220 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
35230 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
35240 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
35250 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
35260 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
35270 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
35280 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
35290 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
352a0 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
352b0 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
352c0 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
352d0 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
352e0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
352f0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
35300 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
35310 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
35320 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
35330 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
35340 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
35350 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
35360 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
35370 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
35380 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
35390 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
353c0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
353d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
353e0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
353f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
35400 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
35410 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
35420 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
35430 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
35440 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
35450 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
35460 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
35470 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
35480 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
35490 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
354a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
354b0 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
354c0 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
354d0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
354e0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
354f0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
35500 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
35510 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
35520 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
35530 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35540 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
35550 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
35560 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
35570 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35580 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f  TER(pVfs);..  zO
35590 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
355a0 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
355b0 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
355c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
355d0 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
355e0 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
355f0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
35600 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
35610 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
35620 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
35630 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
35640 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
35650 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
35660 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
35670 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72   nCwd = (int)str
35680 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73  len(zOut);.    s
35690 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
356a0 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74  nOut-nCwd, &zOut
356b0 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a  [nCwd], "/%s", z
356c0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
356d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
356e0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
356f0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
35700 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
35710 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
35720 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
35730 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
35740 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
35750 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
35760 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
35770 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
35780 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
35790 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
357a0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
357b0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
357c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
357d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
357e0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
357f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
35800 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
35810 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
35820 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
35830 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
35840 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
35850 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
35860 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
35870 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
35880 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
35890 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
358a0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
358b0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
358c0 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
358d0 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
358e0 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
358f0 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
35900 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
35910 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
35920 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
35930 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
35940 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
35950 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
35960 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
35970 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
35980 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
35990 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
359a0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
359b0 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
359c0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
359d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
359e0 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
359f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
35a00 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
35a10 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
35a20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35a30 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
35a40 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
35a50 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
35a60 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
35a70 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
35a80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
35a90 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
35aa0 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
35ab0 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
35ac0 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
35ad0 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
35ae0 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
35af0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
35b00 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
35b10 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
35b20 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
35b30 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
35b40 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
35b50 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
35b60 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
35b70 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
35b80 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
35b90 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
35ba0 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
35bb0 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
35bc0 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
35bd0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
35be0 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
35bf0 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
35c00 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
35c10 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
35c20 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
35c30 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
35c40 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
35c50 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
35c60 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
35c70 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
35c80 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
35c90 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
35ca0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
35cb0 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
35cc0 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
35cd0 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
35ce0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
35cf0 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
35d00 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
35d10 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
35d20 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
35d30 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
35d40 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
35d50 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
35d60 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
35d70 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
35d80 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
35d90 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
35da0 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
35db0 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
35dc0 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
35dd0 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
35de0 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
35df0 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
35e00 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
35e10 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
35e20 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
35e30 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
35e40 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35e50 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
35e60 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
35e70 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
35e80 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
35e90 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
35ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
35eb0 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
35ec0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
35ed0 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
35ee0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35ef0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
35f00 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
35f10 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
35f20 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
35f30 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
35f40 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
35f50 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
35f60 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
35f70 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
35f80 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
35f90 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
35fa0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
35fb0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
35fc0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
35fd0 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
35fe0 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
35ff0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
36000 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
36010 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
36020 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
36030 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
36040 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36050 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
36060 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
36070 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
36080 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
36090 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
360a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
360b0 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
360c0 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
360d0 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
360e0 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
360f0 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
36100 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
36110 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
36120 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
36130 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
36140 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
36150 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
36160 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
36170 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
36180 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
36190 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
361a0 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
361b0 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
361c0 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
361d0 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
361e0 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
361f0 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
36200 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
36210 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
36220 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
36230 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
36240 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
36250 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
36260 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
36270 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
36280 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
36290 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
362a0 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
362b0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
362c0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
362d0 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
362e0 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
362f0 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
36300 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
36310 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
36320 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
36330 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
36340 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a  t pid, fd, got;.
36350 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
36360 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
36370 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
36380 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
36390 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
363a0 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
363b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
363c0 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
363d0 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20  (t));.      pid 
363e0 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
363f0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
36400 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
36410 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
36420 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
36430 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69  eof(t)+sizeof(pi
36440 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
36450 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
36460 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
36470 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65  eof(pid);.    }e
36480 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67  lse{.      do{ g
36490 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  ot = osRead(fd, 
364a0 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
364b0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
364c0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
364d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
364e0 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
364f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
36500 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
36510 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
36520 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
36530 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
36540 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
36550 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
36560 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
36570 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
36580 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
36590 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
365a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
365b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
365c0 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
365d0 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
365e0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
365f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
36600 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
36610 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
36620 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
36630 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
36640 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
36650 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
36660 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
36670 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
36680 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
36690 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
366a0 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
366b0 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
366c0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
366d0 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
366e0 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
366f0 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
36700 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
36710 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
36720 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
36730 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
36740 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
36750 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
36760 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
36770 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
36780 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
36790 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
367a0 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
367b0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
367c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
367d0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
367e0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
367f0 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
36800 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
36810 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
36820 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
36830 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
36840 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
36850 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
36860 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
36870 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
36880 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
36890 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
368a0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
368b0 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
368c0 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
368d0 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
368e0 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
368f0 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
36900 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
36910 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
36920 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
36930 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
36940 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
36950 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
36960 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
36970 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
36980 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
36990 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
369a0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
369b0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
369c0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
369d0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
369e0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
369f0 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
36a00 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
36a10 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
36a20 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
36a30 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
36a40 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
36a50 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
36a60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
36a70 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
36a80 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
36a90 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
36aa0 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
36ab0 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
36ac0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
36ad0 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
36ae0 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
36af0 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
36b00 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
36b10 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
36b20 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
36b30 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
36b40 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
36b50 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
36b60 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
36b70 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
36b80 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
36b90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
36ba0 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
36bb0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
36bc0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
36bd0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
36be0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
36bf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36c00 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  E_OK;.#if define
36c10 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
36c20 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
36c30 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
36c40 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
36c50 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  t)*1000 + unixEp
36c60 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
36c70 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
36c80 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
36c90 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
36ca0 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
36cb0 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
36cc0 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
36cd0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
36ce0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
36cf0 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
36d00 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
36d10 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
36d20 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f  ;.  if( gettimeo
36d30 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d  fday(&sNow, 0)==
36d40 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  0 ){.    *piNow 
36d50 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
36d60 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
36d70 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
36d80 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
36d90 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
36da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
36db0 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  R;.  }.#endif..#
36dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
36dd0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
36de0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
36df0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
36e00 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
36e10 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
36e20 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
36e30 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
36e40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
36e50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
36e60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36e70 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
36e80 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
36e90 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
36ea0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
36eb0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
36ec0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
36ed0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
36ee0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
36ef0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
36f00 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
36f10 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
36f20 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
36f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
36f40 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
36f50 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
36f60 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
36f70 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
36f80 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  t64 i = 0;.  int
36f90 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   rc;.  UNUSED_PA
36fa0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
36fb0 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72  ;.  rc = unixCur
36fc0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
36fd0 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
36fe0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
36ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37000 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
37010 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
37020 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
37030 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
37040 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
37050 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
37060 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
37070 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
37080 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
37090 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
370a0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
370b0 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
370c0 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
370d0 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
370e0 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
370f0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
37100 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
37110 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
37120 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
37130 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
37140 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
37150 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
37160 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
37170 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
37180 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
37190 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
371a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
371b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
371c0 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
371d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
371e0 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
371f0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
37200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37210 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
37220 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
37230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37240 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
37250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37290 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
372a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
372f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37300 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
37310 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
37320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
37340 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
37350 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
37360 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
37370 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
37380 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
37390 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
373a0 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
373b0 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
373c0 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
373d0 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
373e0 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
373f0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
37400 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
37410 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
37420 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
37430 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
37440 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
37450 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
37460 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
37470 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
37480 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
37490 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
374a0 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
374b0 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
374c0 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
374d0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
374e0 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
374f0 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
37500 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
37510 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
37520 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
37530 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
37540 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
37550 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
37560 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
37570 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
37580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
37590 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
375a0 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
375b0 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
375c0 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
375d0 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
375e0 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
375f0 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
37600 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
37610 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
37620 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
37630 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
37640 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
37650 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
37660 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
37670 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
37680 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
37690 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
376a0 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
376b0 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
376c0 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
376d0 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
376e0 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
376f0 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
37700 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
37710 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
37720 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
37730 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
37740 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
37750 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
37760 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
37770 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
37780 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
37790 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
377a0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
377b0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
377c0 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
377d0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
377e0 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
377f0 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
37800 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
37810 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
37820 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45  00000.**      RE
37830 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
37840 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
37850 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
37860 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
37870 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
37880 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
37890 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
378a0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
378b0 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
378c0 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
378d0 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
378e0 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
378f0 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
37900 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
37910 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
37920 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
37930 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
37940 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
37950 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
37960 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
37970 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
37980 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
37990 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
379a0 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
379b0 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
379c0 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
379d0 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
379e0 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
379f0 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
37a00 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
37a10 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
37a20 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
37a30 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
37a40 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
37a50 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
37a60 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
37a70 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
37a80 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
37a90 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
37aa0 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
37ab0 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
37ac0 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
37ad0 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
37ae0 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
37af0 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
37b00 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
37b10 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
37b20 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
37b30 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
37b40 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
37b50 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
37b60 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
37b70 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
37b80 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
37b90 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
37ba0 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
37bb0 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
37bc0 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
37bd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
37be0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
37bf0 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
37c00 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
37c10 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
37c20 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
37c30 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
37c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
37c50 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
37c60 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
37c70 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
37c80 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
37c90 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cb0 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
37cc0 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
37cd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
37ce0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
37cf0 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
37d00 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
37d10 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
37d20 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
37d30 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
37d40 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
37d50 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
37d60 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
37d70 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
37d80 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
37d90 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
37da0 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
37db0 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
37dc0 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
37dd0 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
37de0 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
37df0 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
37e00 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
37e10 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
37e20 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
37e30 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
37e40 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
37e50 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
37e60 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
37e70 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
37e80 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
37e90 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
37ea0 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
37eb0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
37ec0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
37ed0 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
37ee0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
37ef0 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
37f00 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
37f10 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
37f20 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
37f30 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
37f40 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
37f50 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
37f60 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
37f70 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
37f80 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
37f90 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
37fa0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
37fb0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
37fc0 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
37fd0 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
37fe0 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
37ff0 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
38000 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
38010 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
38020 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
38030 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
38040 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
38050 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
38060 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
38070 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
38080 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
38090 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
380a0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
380b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
380c0 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
380d0 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
380e0 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
380f0 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
38100 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
38110 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
38120 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
38130 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
38140 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
38150 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
38160 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
38170 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
38180 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
38190 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
381a0 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
381b0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
381c0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
381d0 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
381e0 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
381f0 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
38200 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
38210 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
38220 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
38230 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
38240 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
38250 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
38260 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
38270 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
38280 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
38290 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
382a0 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
382b0 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
382c0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
382d0 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
382e0 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
382f0 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
38300 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
38310 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
38320 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
38330 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
38340 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
38350 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
38360 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
38370 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
38380 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
38390 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
383a0 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
383b0 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
383c0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
383d0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
383e0 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
383f0 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
38400 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
38410 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
38420 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
38430 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
38440 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
38450 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
38460 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
38470 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
38480 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
38490 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
384a0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
384b0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
384c0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
384d0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
384e0 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
384f0 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
38500 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
38510 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
38520 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
38530 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
38540 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
38550 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
38560 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
38570 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
38580 66 69 6c 65 2e 20 20 20 54 68 69 7