/ Hex Artifact Content
Login

Artifact 43d5790e037c7af7a8d95fc2334136990f556fd4:


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 20 2a 2a 20 44 65 66 61 75 6c 74 20  ./*. ** Default 
15b0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
15c0: 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70   creating auto p
15d0: 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66  roxy dir. */.#if
15e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
15f0: 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
1600: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1610: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1620: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
1630: 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69  SIONS 0755.#endi
1640: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
1650: 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d   supported path-
1660: 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69  length..*/.#defi
1670: 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  ne MAX_PATHNAME 
1680: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20  512../*.** Only 
1690: 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e  set the lastErrn
16a0: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63  o if the error c
16b0: 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72  ode is a real er
16c0: 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20  ror and not .** 
16d0: 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65  a normal expecte
16e0: 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  d return code of
16f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
1700: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65  SQLITE_OK.*/.#de
1710: 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52  fine IS_LOCK_ERR
1720: 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51  OR(x)  ((x != SQ
1730: 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21  LITE_OK) && (x !
1740: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a  = SQLITE_BUSY)).
1750: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1760: 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65  rences */.typede
1770: 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  f struct unixShm
1780: 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20   unixShm;       
1790: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17a0: 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ction shared mem
17b0: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
17c0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
17d0: 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20  e unixShmNode;  
17e0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
17f0: 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a  emory instance *
1800: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1810: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75   unixInodeInfo u
1820: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20  nixInodeInfo;   
1830: 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a  /* An i-node */.
1840: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55  typedef struct U
1850: 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78  nixUnusedFd Unix
1860: 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a  UnusedFd;     /*
1870: 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   An unused file 
1880: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f  descriptor */../
1890: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20  *.** Sometimes, 
18a0: 61 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e  after a file han
18b0: 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79  dle is closed by
18c0: 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c   SQLite, the fil
18d0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
18e0: 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  cannot be closed
18f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e   immediately. In
1900: 20 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e   these cases, in
1910: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66  stances of the f
1920: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
1930: 63 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74  cture are used t
1940: 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1950: 20 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c   descriptor whil
1960: 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e  e waiting for an
1970: 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  .** opportunity 
1980: 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20  to either close 
1990: 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a  or reuse it..*/.
19a0: 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65  struct UnixUnuse
19b0: 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20  dFd {.  int fd; 
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
19e0: 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f  ptor to close */
19f0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a10: 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20  Flags this file 
1a20: 64 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f  descriptor was o
1a30: 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20  pened with */.  
1a40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
1a50: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78  ext;      /* Nex
1a60: 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  t unused file de
1a70: 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65  scriptor on same
1a80: 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   file */.};../*.
1a90: 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20  ** The unixFile 
1aa0: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62  structure is sub
1ab0: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
1ac0: 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74  _file specific t
1ad0: 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46  o the unix.** VF
1ae0: 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1af0: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1b00: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e  ruct unixFile un
1b10: 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75  ixFile;.struct u
1b20: 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69  nixFile {.  sqli
1b30: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
1b40: 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20  onst *pMethod;  
1b50: 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69  /* Always the fi
1b60: 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  rst entry */.  s
1b70: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b90: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68     /* The VFS th
1ba0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
1bb0: 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e  unixFile */.  un
1bc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1bd0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1be0: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1bf0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1c00: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  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 20 20 2f 2a 20               /* 
1c30: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1c40: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
1c50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
1c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c70: 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b  The type of lock
1c80: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64   held on this fd
1c90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1ca0: 68 61 72 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  har ctrlFlags;  
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 68            /* Beh
1cc0: 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55  avioral bits.  U
1cd0: 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
1ce0: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1cf0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d10: 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20  unix errno from 
1d20: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1d30: 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  /.  void *lockin
1d40: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20  gContext;       
1d50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69          /* Locki
1d60: 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng style specifi
1d70: 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69  c state */.  Uni
1d80: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
1d90: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1da0: 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65   /* Pre-allocate
1db0: 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  d UnixUnusedFd *
1dc0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1dd0: 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  zPath;          
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1df0: 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1e00: 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20   unixShm *pShm; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1e30: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e  emory segment in
1e40: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  formation */.  i
1e50: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1e80: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1e90: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1ea0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1eb0: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1ec0: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1ef0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1f00: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1f10: 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
1f20: 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74  PROTECTION.  int
1f30: 20 70 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20   protFlags;     
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 2f 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74   /* Data protect
1f60: 69 6f 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75  ion flags from u
1f70: 6e 69 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  nixOpen */.#endi
1f80: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1f90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1fa0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1fb0: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1fc0: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe0: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1ff0: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
2010: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2020: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
2030: 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id;          /* 
2040: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
2050: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  /.#endif.#ifndef
2060: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65   NDEBUG.  /* The
2070: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76   next group of v
2080: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
2090: 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68  d to track wheth
20a0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20  er or not the.  
20b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
20c0: 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20  ounter in bytes 
20d0: 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73  24-27 of databas
20e0: 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61  e files are upda
20f0: 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65  ted.  ** wheneve
2100: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
2110: 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  e database chang
2120: 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f  es.  An assertio
2130: 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a  n fault will.  *
2140: 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c  * occur if a fil
2150: 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  e is updated wit
2160: 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69  hout also updati
2170: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2180: 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e  on.  ** counter.
2190: 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d    This test is m
21a0: 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77  ade to avoid new
21b0: 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61   problems simila
21c0: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e  r to the.  ** on
21d0: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
21e0: 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20  icket #3584. .  
21f0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2200: 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  ar transCntrChng
2210: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
2220: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
2230: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a  ounter changed *
2240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2250: 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20  r dbUpdate;     
2260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2270: 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61  y part of databa
2280: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20  se file changed 
2290: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
22a0: 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  ar inNormalWrite
22b0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69  ;   /* True if i
22c0: 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  n a normal write
22d0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65   operation */.#e
22e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
22f0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
2300: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
2310: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2320: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2330: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2340: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2350: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2360: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2370: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2380: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2390: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
23a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23c0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23d0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
23e0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
23f0: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2400: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2410: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2420: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2430: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2440: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2450: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2460: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2470: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2480: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
2490: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24a0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24c0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24d0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
24e0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
24f0: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2500: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2510: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2520: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2530: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2540: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2550: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2560: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2570: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
2580: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
2590: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25a0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25b0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25c0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25d0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
25e0: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
25f0: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2600: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2610: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2620: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2630: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2640: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2650: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2660: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2670: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2680: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2690: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26a0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26b0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26c0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26d0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
26e0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
26f0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2700: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2710: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2730: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2740: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2760: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2770: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2780: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2790: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27a0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27b0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27c0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27d0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
27e0: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
27f0: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2800: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2810: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2820: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2830: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2840: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2850: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2860: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2870: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
2880: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2890: 5f 5f 41 50 50 4c 45 5f 5f 0a 23 64 65 66 69 6e  __APPLE__.#defin
28a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
28b0: 53 55 50 45 52 4c 4f 43 4b 20 31 0a 23 65 6e 64  SUPERLOCK 1.#end
28c0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  if..#if SQLITE_E
28d0: 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 0a  NABLE_SUPERLOCK.
28e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
28f0: 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  3.h".#include <s
2900: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
2910: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a  e <assert.h>../*
2920: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
2930: 74 6f 20 63 6f 6c 6c 65 63 74 20 61 20 62 75 73  to collect a bus
2940: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
2950: 63 6b 20 61 6e 64 20 61 72 67 75 6d 65 6e 74 20  ck and argument 
2960: 61 6e 64 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f  and a count.** o
2970: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2980: 74 69 6d 65 73 20 69 74 20 68 61 73 20 62 65 65  times it has bee
2990: 6e 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  n invoked..*/.st
29a0: 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 42 75  ruct SuperlockBu
29b0: 73 79 20 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75  sy {.  int (*xBu
29c0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  sy)(void*,int); 
29d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
29e0: 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
29f0: 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
2a00: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 3b 20  void *pBusyArg; 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
2a30: 70 61 73 73 20 74 6f 20 78 42 75 73 79 20 2a 2f  pass to xBusy */
2a40: 0a 20 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20  .  int nBusy;   
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a70: 74 69 6d 65 73 20 78 42 75 73 79 20 68 61 73 20  times xBusy has 
2a80: 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  been invoked */.
2a90: 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
2aa0: 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20  t SuperlockBusy 
2ab0: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a  SuperlockBusy;..
2ac0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2ad0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2ae0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2af0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
2b00: 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 75 70  ch active.** sup
2b10: 65 72 6c 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71  erlock. The opaq
2b20: 75 65 20 68 61 6e 64 6c 65 20 72 65 74 75 72 6e  ue handle return
2b30: 65 64 20 62 79 20 73 71 6c 69 74 65 33 64 65 6d  ed by sqlite3dem
2b40: 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 20 69 73  o_superlock() is
2b50: 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 61 20 70  .** actually a p
2b60: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2b70: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
2b80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
2b90: 63 74 20 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20  ct Superlock {. 
2ba0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
2bd0: 64 6c 65 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b  dle used to lock
2be0: 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61   db */.  int bWa
2bf0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c10: 20 69 66 20 64 62 20 69 73 20 61 20 57 41 4c 20   if db is a WAL 
2c20: 64 61 74 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74  database */.};.t
2c30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
2c40: 70 65 72 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63  perlock Superloc
2c50: 6b 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43  k;../*.** The pC
2c60: 74 78 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  tx pointer passe
2c70: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2c80: 6f 6e 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  on is actually a
2c90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
2ca0: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 73   SuperlockBusy s
2cb0: 74 72 75 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65  tructure. Invoke
2cc0: 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
2cd0: 72 20 66 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70  r function encap
2ce0: 73 75 6c 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  sulated.** by th
2cf0: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
2d00: 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  return the resul
2d10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2d20: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
2d30: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 74 78  ndler(void *pCtx
2d40: 2c 20 69 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20  , int UNUSED){. 
2d50: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a   SuperlockBusy *
2d60: 70 42 75 73 79 20 3d 20 28 53 75 70 65 72 6c 6f  pBusy = (Superlo
2d70: 63 6b 42 75 73 79 20 2a 29 70 43 74 78 3b 0a 20  ckBusy *)pCtx;. 
2d80: 20 69 66 28 20 70 42 75 73 79 2d 3e 78 42 75 73   if( pBusy->xBus
2d90: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
2da0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 73 79 2d  .  return pBusy-
2db0: 3e 78 42 75 73 79 28 70 42 75 73 79 2d 3e 70 42  >xBusy(pBusy->pB
2dc0: 75 73 79 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e  usyArg, pBusy->n
2dd0: 42 75 73 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Busy++);.}../*.*
2de0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2df0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
2e00: 6d 69 6e 65 20 69 66 20 74 68 65 20 6d 61 69 6e  mine if the main
2e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2e20: 6f 72 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  or .** connectio
2e30: 6e 20 64 62 20 69 73 20 6f 70 65 6e 20 69 6e 20  n db is open in 
2e40: 57 41 4c 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e  WAL mode or not.
2e50: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2e60: 75 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  urs and the.** d
2e70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2e80: 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74  in WAL mode, set
2e90: 20 2a 70 62 57 61 6c 20 74 6f 20 74 72 75 65 20   *pbWal to true 
2ea0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
2eb0: 45 5f 4f 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69  E_OK..** If it i
2ec0: 73 20 6e 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64  s not in WAL mod
2ed0: 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f  e, set *pbWal to
2ee0: 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
2ef0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2f00: 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
2f10: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
2f20: 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 57  he value of *pbW
2f30: 61 6c 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e  al.** is undefin
2f40: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
2f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2f60: 75 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75  uperlockIsWal(Su
2f70: 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  perlock *pLock){
2f80: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2fb0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
2fc0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
2fd0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c         /* Compil
2fe0: 65 64 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  ed PRAGMA journa
2ff0: 6c 5f 6d 6f 64 65 20 73 74 61 74 65 6d 65 6e 74  l_mode statement
3000: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   */..  rc = sqli
3010: 74 65 33 5f 70 72 65 70 61 72 65 28 70 4c 6f 63  te3_prepare(pLoc
3020: 6b 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 6d  k->db, "PRAGMA m
3030: 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ain.journal_mode
3040: 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
3050: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3060: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
3070: 72 63 3b 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57  rc;..  pLock->bW
3080: 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51  al = 0;.  if( SQ
3090: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
30a0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
30b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
30c0: 2a 7a 4d 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20  *zMode = (const 
30d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
30e0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
30f0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  , 0);.    if( zM
3100: 6f 64 65 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d  ode && strlen(zM
3110: 6f 64 65 29 3d 3d 33 20 26 26 20 73 71 6c 69 74  ode)==3 && sqlit
3120: 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 77 61 6c  e3_strnicmp("wal
3130: 22 2c 20 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20  ", zMode, 3)==0 
3140: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  ){.      pLock->
3150: 62 57 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bWal = 1;.    }.
3160: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
3170: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
3180: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
3190: 4f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  Obtain an exclus
31a0: 69 76 65 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20  ive shm-lock on 
31b0: 6e 42 79 74 65 20 62 79 74 65 73 20 73 74 61 72  nByte bytes star
31c0: 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 20 69  ting at offset i
31d0: 64 78 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  dx.** of the fil
31e0: 65 20 66 64 2e 20 49 66 20 74 68 65 20 6c 6f 63  e fd. If the loc
31f0: 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
3200: 69 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ined immediately
3210: 2c 20 69 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20  , invoke.** the 
3220: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74  busy-handler unt
3230: 69 6c 20 65 69 74 68 65 72 20 69 74 20 69 73 20  il either it is 
3240: 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20  obtained or the 
3250: 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy-handler.** 
3260: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
3270: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3280: 74 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  t superlockShmLo
3290: 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
32a0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
32b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
32c0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  e file handle */
32d0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
3300: 73 68 6d 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61  shm-lock to obta
3310: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  in */.  int nByt
3320: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3330: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3340: 72 20 6f 66 20 63 6f 6e 73 65 63 74 69 76 65 20  r of consective 
3350: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
3360: 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  .  SuperlockBusy
3370: 20 2a 70 42 75 73 79 20 20 20 20 20 20 20 20 20   *pBusy         
3380: 20 20 20 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c     /* Busy-handl
3390: 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63  er wrapper objec
33a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
33b0: 3b 0a 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f  ;.  int (*xShmLo
33c0: 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck)(sqlite3_file
33d0: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  *, int, int, int
33e0: 29 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  ) = fd->pMethods
33f0: 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f  ->xShmLock;.  do
3400: 20 7b 0a 20 20 20 20 72 63 20 3d 20 78 53 68 6d   {.    rc = xShm
3410: 4c 6f 63 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42  Lock(fd, idx, nB
3420: 79 74 65 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  yte, SQLITE_SHM_
3430: 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f  LOCK|SQLITE_SHM_
3440: 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77  EXCLUSIVE);.  }w
3450: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
3460: 5f 42 55 53 59 20 26 26 20 73 75 70 65 72 6c 6f  _BUSY && superlo
3470: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 28 76  ckBusyHandler((v
3480: 6f 69 64 20 2a 29 70 42 75 73 79 2c 20 30 29 20  oid *)pBusy, 0) 
3490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
34b0: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20  the extra locks 
34c0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34d0: 66 69 6c 65 20 72 65 71 75 69 72 65 64 20 66 6f  file required fo
34e0: 72 20 57 41 4c 20 64 61 74 61 62 61 73 65 73 2e  r WAL databases.
34f0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3500: 75 70 70 6c 69 65 64 20 62 75 73 79 2d 68 61 6e  upplied busy-han
3510: 64 6c 65 72 20 61 73 20 72 65 71 75 69 72 65 64  dler as required
3520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3530: 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b  superlockWalLock
3540: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3570: 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57  handle open on W
3580: 41 4c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  AL database */. 
3590: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a   SuperlockBusy *
35a0: 70 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20  pBusy           
35b0: 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72   /* Busy handler
35c0: 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20   wrapper object 
35d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
3600: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
3610: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30  te3_file *fd = 0
3620: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
3630: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
3640: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f  e handle */.  vo
3650: 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d  id volatile *p =
3660: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
3670: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
3680: 74 20 70 61 67 65 20 6f 66 20 73 68 61 72 65 64  t page of shared
3690: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a   memory */..  /*
36a0: 20 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   Obtain a pointe
36b0: 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  r to the sqlite3
36c0: 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65  _file object ope
36d0: 6e 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 62  n on the main db
36e0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d   file. */.  rc =
36f0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
3700: 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
3710: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  , SQLITE_FCNTL_F
3720: 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f  ILE_POINTER, (vo
3730: 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 69 66 28  id *)&fd);.  if(
3740: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
3760: 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 22 72 65  * Obtain the "re
3770: 63 6f 76 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f  covery" lock. No
3780: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63  rmally, this loc
3790: 6b 20 69 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e  k is only obtain
37a0: 65 64 20 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e  ed by.  ** clien
37b0: 74 73 20 72 75 6e 6e 69 6e 67 20 64 61 74 61 62  ts running datab
37c0: 61 73 65 20 72 65 63 6f 76 65 72 79 2e 20 20 0a  ase recovery.  .
37d0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70 65    */.  rc = supe
37e0: 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c  rlockShmLock(fd,
37f0: 20 32 2c 20 31 2c 20 70 42 75 73 79 29 3b 0a 20   2, 1, pBusy);. 
3800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3810: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
3820: 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73  .  /* Zero the s
3830: 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73  tart of the firs
3840: 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
3850: 70 61 67 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  page. This means
3860: 20 74 68 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63   that any.  ** c
3870: 6c 69 65 6e 74 73 20 74 68 61 74 20 6f 70 65 6e  lients that open
3880: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
3890: 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d  ransactions from
38a0: 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77   this point on w
38b0: 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f  ill.  ** have to
38c0: 20 72 75 6e 20 72 65 63 6f 76 65 72 79 20 62 65   run recovery be
38d0: 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
38e0: 20 53 69 6e 63 65 20 74 68 65 79 20 6e 65 65 64   Since they need
38f0: 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 0a   the "recovery".
3900: 20 20 2a 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74    ** lock that t
3910: 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 68  his process is h
3920: 6f 6c 64 69 6e 67 20 74 6f 20 64 6f 20 74 68 61  olding to do tha
3930: 74 2c 20 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f  t, no new read o
3940: 72 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61  r write.  ** tra
3950: 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f  nsactions may no
3960: 77 20 62 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72  w be opened. Nor
3970: 20 63 61 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   can a checkpoin
3980: 74 20 62 65 20 72 75 6e 2c 20 66 6f 72 20 74 68  t be run, for th
3990: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 72 65 61 73  e.  ** same reas
39a0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
39b0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  fd->pMethods->xS
39c0: 68 6d 4d 61 70 28 66 64 2c 20 30 2c 20 33 32 2a  hmMap(fd, 0, 32*
39d0: 31 30 32 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20  1024, 1, &p);.  
39e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
39f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
3a00: 20 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29   memset((void *)
3a10: 70 2c 20 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a  p, 0, 32);..  /*
3a20: 20 4f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76   Obtain exclusiv
3a30: 65 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74  e locks on all t
3a40: 68 65 20 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73  he "read-lock" s
3a50: 6c 6f 74 73 2e 20 4f 6e 63 65 20 74 68 65 73 65  lots. Once these
3a60: 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20   locks.  ** are 
3a70: 68 65 6c 64 2c 20 69 74 20 69 73 20 67 75 61 72  held, it is guar
3a80: 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 72  anteed that ther
3a90: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
3aa0: 72 65 61 64 65 72 2c 20 77 72 69 74 65 72 20 6f  reader, writer o
3ab0: 72 20 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69  r .  ** checkpoi
3ac0: 6e 74 65 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20  nter clients..  
3ad0: 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c  */.  rc = superl
3ae0: 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33  ockShmLock(fd, 3
3af0: 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  , SQLITE_SHM_NLO
3b00: 43 4b 2d 33 2c 20 70 42 75 73 79 29 3b 0a 20 20  CK-3, pBusy);.  
3b10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3b20: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 75  .** Release a su
3b30: 70 65 72 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  perlock held on 
3b40: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
3b50: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61   The argument pa
3b60: 73 73 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73  ssed to .** this
3b70: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68   function must h
3b80: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
3b90: 64 20 66 72 6f 6d 20 61 20 73 75 63 63 65 73 73  d from a success
3ba0: 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  ful call to.** s
3bb0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
3bc0: 6c 6f 63 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lock()..*/.stati
3bd0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 64 65  c void sqlite3de
3be0: 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76  mo_superunlock(v
3bf0: 6f 69 64 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53  oid *pLock){.  S
3c00: 75 70 65 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53  uperlock *p = (S
3c10: 75 70 65 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b  uperlock *)pLock
3c20: 3b 0a 20 20 69 66 28 20 70 2d 3e 62 57 61 6c 20  ;.  if( p->bWal 
3c30: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3c60: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74   code */.    int
3c70: 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
3c80: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
3c90: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
3ca0: 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  E;.    sqlite3_f
3cb0: 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20  ile *fd = 0;.   
3cc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3cd0: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
3ce0: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
3cf0: 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
3d00: 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64  TER, (void *)&fd
3d10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3d30: 20 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e    fd->pMethods->
3d40: 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20  xShmLock(fd, 2, 
3d50: 31 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  1, flags);.     
3d60: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78   fd->pMethods->x
3d70: 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53  ShmLock(fd, 3, S
3d80: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d  QLITE_SHM_NLOCK-
3d90: 33 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  3, flags);.    }
3da0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
3db0: 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 73  lose(p->db);.  s
3dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
3dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
3de0: 61 20 73 75 70 65 72 6c 6f 63 6b 20 6f 6e 20 74  a superlock on t
3df0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3e00: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
3e10: 50 61 74 68 2c 20 75 73 69 6e 67 20 74 68 65 0a  Path, using the.
3e20: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  ** locking primi
3e30: 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 20 62  tives provided b
3e40: 79 20 56 46 53 20 7a 56 66 73 2e 20 49 66 20 73  y VFS zVfs. If s
3e50: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
3e60: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
3e70: 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76  ned and output v
3e80: 61 72 69 61 62 6c 65 20 2a 70 70 4c 6f 63 6b 20  ariable *ppLock 
3e90: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
3ea0: 68 20 61 6e 20 6f 70 61 71 75 65 20 68 61 6e 64  h an opaque hand
3eb0: 6c 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  le.** that may b
3ec0: 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
3ed0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
3ee0: 6f 63 6b 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ock() to release
3ef0: 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   the lock..**.**
3f00: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
3f10: 75 72 73 2c 20 2a 70 70 4c 6f 63 6b 20 69 73 20  urs, *ppLock is 
3f20: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 61 6e 20  set to 0 and an 
3f30: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
3f40: 65 20 0a 2a 2a 20 28 65 2e 67 2e 20 53 51 4c 49  e .** (e.g. SQLI
3f50: 54 45 5f 42 55 53 59 29 20 69 73 20 72 65 74 75  TE_BUSY) is retu
3f60: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
3f70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 63   required lock c
3f80: 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
3f90: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  d immediately an
3fa0: 64 20 74 68 65 20 78 42 75 73 79 20 70 61 72 61  d the xBusy para
3fb0: 6d 65 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  meter.** to this
3fc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
3fd0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 78 42 75 73   NULL, then xBus
3fe0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 6e 20  y is invoked in 
3ff0: 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
4000: 61 73 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  as a busy-handle
4010: 72 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  r registered wit
4020: 68 20 53 51 4c 69 74 65 20 28 75 73 69 6e 67 20  h SQLite (using 
4030: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
4040: 64 6c 65 72 28 29 29 0a 2a 2a 20 75 6e 74 69 6c  dler()).** until
4050: 20 65 69 74 68 65 72 20 74 68 65 20 6c 6f 63 6b   either the lock
4060: 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
4070: 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e   or the busy-han
4080: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  dler function re
4090: 74 75 72 6e 73 0a 2a 2a 20 30 20 28 69 6e 64 69  turns.** 0 (indi
40a0: 63 61 74 69 6e 67 20 22 67 69 76 65 20 75 70 22  cating "give up"
40b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
40c0: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
40d0: 65 72 6c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  erlock(.  const 
40e0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
4100: 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
4110: 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  le to lock */.  
4120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
4130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4140: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 74 6f  /* VFS to use to
4150: 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
4160: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66   file */.  int f
4170: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
4180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4190: 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 74  ditional flags t
41a0: 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65  o pass to sqlite
41b0: 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a 20 20 69  3_open_v2 */.  i
41c0: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
41d0: 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20 20 20 2f  *,int),        /
41e0: 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20 63  * Busy handler c
41f0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
4200: 64 20 2a 70 42 75 73 79 41 72 67 2c 20 20 20 20  d *pBusyArg,    
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4220: 43 6f 6e 74 65 78 74 20 61 72 67 20 66 6f 72 20  Context arg for 
4230: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a  busy handler */.
4240: 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f 63 6b 20    void **ppLock 
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e 74 65 78    /* OUT: Contex
4270: 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73 75 70  t to pass to sup
4280: 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f 0a 29 7b  erunlock() */.){
4290: 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  .  SuperlockBusy
42a0: 20 62 75 73 79 20 3d 20 7b 30 2c 20 30 2c 20 30   busy = {0, 0, 0
42b0: 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c  }; /* Busy handl
42c0: 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63  er wrapper objec
42d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
4300: 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75 70 65 72   code */.  Super
4310: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  lock *pLock;..  
4320: 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  pLock = sqlite3_
4330: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 75  malloc(sizeof(Su
4340: 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20 69 66 28  perlock));.  if(
4350: 20 21 70 4c 6f 63 6b 20 29 20 72 65 74 75 72 6e   !pLock ) return
4360: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4370: 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b 2c 20 30   memset(pLock, 0
4380: 2c 20 73 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f  , sizeof(Superlo
4390: 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ck));..  /* Open
43a0: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
43b0: 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 74  le on the file t
43c0: 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20 2a 2f 0a  o superlock. */.
43d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
43e0: 70 65 6e 5f 76 32 28 0a 20 20 20 20 20 20 7a 50  pen_v2(.      zP
43f0: 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e 64 62 2c  ath, &pLock->db,
4400: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
4410: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
4420: 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61 67 73 2c  EN_CREATE|flags,
4430: 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a   zVfs.  );..  /*
4440: 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d   Install a busy-
4450: 68 61 6e 64 6c 65 72 20 61 6e 64 20 65 78 65 63  handler and exec
4460: 75 74 65 20 61 20 42 45 47 49 4e 20 45 58 43 4c  ute a BEGIN EXCL
4470: 55 53 49 56 45 2e 20 49 66 20 74 68 69 73 20 69  USIVE. If this i
4480: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20 57 41 4c  s not.  ** a WAL
4490: 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
44a0: 69 73 20 61 6c 6c 20 77 65 20 6e 65 65 64 20 74  is all we need t
44b0: 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  o do.  .  **.  *
44c0: 2a 20 41 20 77 72 61 70 70 65 72 20 66 75 6e 63  * A wrapper func
44d0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
44e0: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 2d  invoke the busy-
44f0: 68 61 6e 64 6c 65 72 20 69 6e 73 74 65 61 64 20  handler instead 
4500: 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  of.  ** register
4510: 69 6e 67 20 74 68 65 20 62 75 73 79 2d 68 61 6e  ing the busy-han
4520: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 73 75  dler function su
4530: 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75 73  pplied by the us
4540: 65 72 20 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a  er directly.  **
4550: 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68   with SQLite. Th
4560: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
4570: 65 20 73 61 6d 65 20 62 75 73 79 2d 68 61 6e 64  e same busy-hand
4580: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ler function may
4590: 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   be.  ** invoked
45a0: 20 64 69 72 65 63 74 6c 79 20 6c 61 74 65 72 20   directly later 
45b0: 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69  on when attempti
45c0: 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ng to obtain the
45d0: 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a 20 20 2a   extra locks.  *
45e0: 2a 20 72 65 71 75 69 72 65 64 20 69 6e 20 57 41  * required in WA
45f0: 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73 69 6e 67  L mode. By using
4600: 20 74 68 65 20 77 72 61 70 70 65 72 2c 20 77 65   the wrapper, we
4610: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 67 75 61   are able to gua
4620: 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74 68 61 74  rantee.  ** that
4630: 20 74 68 65 20 22 6e 42 75 73 79 22 20 69 6e 74   the "nBusy" int
4640: 65 67 65 72 20 70 61 72 61 6d 65 74 65 72 20 70  eger parameter p
4650: 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 73 65  assed to the use
4660: 72 73 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  rs busy-handler.
4670: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 73 20    ** represents 
4680: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
4690: 20 6f 66 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   of busy-handler
46a0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 61 64   invocations mad
46b0: 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  e within.  ** th
46c0: 69 73 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  is call to sqlit
46d0: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
46e0: 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e  (), including an
46f0: 79 20 6d 61 64 65 20 64 75 72 69 6e 67 20 74 68  y made during th
4700: 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e 20 45 58  e.  ** "BEGIN EX
4710: 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a 2f 0a 20  CLUSIVE"..  */. 
4720: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4730: 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73 79 2e 78  OK ){.    busy.x
4740: 42 75 73 79 20 3d 20 78 42 75 73 79 3b 0a 20 20  Busy = xBusy;.  
4750: 20 20 62 75 73 79 2e 70 42 75 73 79 41 72 67 20    busy.pBusyArg 
4760: 3d 20 70 42 75 73 79 41 72 67 3b 0a 20 20 20 20  = pBusyArg;.    
4770: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
4780: 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  dler(pLock->db, 
4790: 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e  superlockBusyHan
47a0: 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a 29 26 62  dler, (void *)&b
47b0: 75 73 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  usy);.    rc = s
47c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f 63  qlite3_exec(pLoc
47d0: 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e 20 45 58  k->db, "BEGIN EX
47e0: 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30 2c 20  CLUSIVE", 0, 0, 
47f0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  0);.  }..  /* If
4800: 20 74 68 65 20 42 45 47 49 4e 20 45 58 43 4c 55   the BEGIN EXCLU
4810: 53 49 56 45 20 77 61 73 20 65 78 65 63 75 74 65  SIVE was execute
4820: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
4830: 6e 64 20 74 68 69 73 20 69 73 20 61 20 57 41 4c  nd this is a WAL
4840: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
4850: 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63 6b 57 61  call superlockWa
4860: 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61 69  lLock() to obtai
4870: 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b  n the extra lock
4880: 73 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  s required.  ** 
4890: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 61 64 65  to prevent reade
48a0: 72 73 2c 20 77 72 69 74 65 72 73 20 61 6e 64 2f  rs, writers and/
48b0: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
48c0: 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 20   from accessing 
48d0: 74 68 65 0a 20 20 2a 2a 20 64 62 20 77 68 69 6c  the.  ** db whil
48e0: 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
48f0: 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  s holding the su
4900: 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20 20  perlock..  **.  
4910: 2a 2a 20 42 65 66 6f 72 65 20 61 74 74 65 6d 70  ** Before attemp
4920: 74 69 6e 67 20 61 6e 79 20 57 41 4c 20 6c 6f 63  ting any WAL loc
4930: 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 74  ks, commit the t
4940: 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
4950: 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a 20 74 6f  ed above.  ** to
4960: 20 64 72 6f 70 20 74 68 65 20 57 41 4c 20 72 65   drop the WAL re
4970: 61 64 20 61 6e 64 20 77 72 69 74 65 20 6c 6f 63  ad and write loc
4980: 6b 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ks currently hel
4990: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  d. Otherwise, th
49a0: 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41 4c 20 6c  e.  ** new WAL l
49b0: 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66 6c 69 63  ocks may conflic
49c0: 74 20 77 69 74 68 20 74 68 65 20 6f 6c 64 2e 0a  t with the old..
49d0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
49e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
49f0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
4a00: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 49 73  rc = superlockIs
4a10: 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26 26 20 70  Wal(pLock)) && p
4a20: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b 0a 20 20  Lock->bWal ){.  
4a30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4a40: 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c  _exec(pLock->db,
4a50: 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
4a60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
4a70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4a80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 75 70          rc = sup
4a90: 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 70 4c  erlockWalLock(pL
4aa0: 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73 79 29 3b  ock->db, &busy);
4ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4ac0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
4ad0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
4ae0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4af0: 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20  unlock(pLock);. 
4b00: 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 30 3b 0a     *ppLock = 0;.
4b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
4b20: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
4b30: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
4b40: 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75 70 74 20  }../* A corrupt 
4b50: 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b 20 77 69  DB won't work wi
4b60: 74 68 20 74 68 65 20 73 71 6c 2d 62 61 73 65 64  th the sql-based
4b70: 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65 6d 70 74   locking attempt
4b80: 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a 20 65 78  , grab an .** ex
4b90: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 6e 64  clusive lock and
4ba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4bb0: 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53 59  K or SQLITE_BUSY
4bc0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   if the lock fai
4bd0: 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74  ls .** returns t
4be0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
4bf0: 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e 20 73 71  level held on sq
4c00: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f 0a 73 74  lite3_file.*/.st
4c10: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4c20: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
4c30: 6f 72 72 75 70 74 28 73 71 6c 69 74 65 33 5f 66  orrupt(sqlite3_f
4c40: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 54 61  ile *id, int eTa
4c50: 72 67 65 74 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  rgetFileLock, in
4c60: 74 20 2a 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  t *pFileLock) {.
4c70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
4c80: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
4c90: 64 3b 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f  d;.  int eFileLo
4ca0: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ck = pFile->eFil
4cb0: 65 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20  eLock;.  int rc 
4cc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
4cd0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c    if( eFileLock<
4ce0: 65 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20  eTargetFileLock 
4cf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4d00: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
4d10: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4d20: 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20  K_SHARED);.  }. 
4d30: 20 69 66 28 20 21 72 63 20 26 26 20 65 46 69 6c   if( !rc && eFil
4d40: 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46 69 6c  eLock<eTargetFil
4d50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  eLock ){.    rc 
4d60: 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
4d70: 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49  ->xLock(id, SQLI
4d80: 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
4d90: 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  E);.  }.  if( rc
4da0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
4db0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65  e->eFileLock > e
4dc0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4dd0: 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
4de0: 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  ->xUnlock(id, eF
4df0: 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  ileLock);.    }.
4e00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4e10: 20 7d 0a 20 20 69 66 20 28 70 46 69 6c 65 4c 6f   }.  if (pFileLo
4e20: 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46 69 6c 65  ck) {.    *pFile
4e30: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
4e40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
4e50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
4e60: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64  tic int sqlite3d
4e70: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
4e80: 63 6f 72 72 75 70 74 28 73 71 6c 69 74 65 33 5f  corrupt(sqlite3_
4e90: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
4ea0: 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
4eb0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
4ec0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
4ed0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4ee0: 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  OK;.  .  if( pFi
4ef0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
4f00: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
4f10: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4f20: 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64  thod->xUnlock(id
4f30: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
4f40: 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ARED);.  }.  if(
4f50: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
4f60: 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  k > eFileLock ){
4f70: 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52  .    int unlockR
4f80: 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  C = pFile->pMeth
4f90: 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
4fa0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45  SQLITE_LOCK_NONE
4fb0: 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20  );.    if (!rc) 
4fc0: 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20  rc = unlockRC;. 
4fd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4fe0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
4ff0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52  ITE_ENABLE_SUPER
5000: 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  LOCK */.../*.** 
5010: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
5020: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
5030: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
5040: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
5050: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
5060: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
5070: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
5080: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
5090: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
50a0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
50b0: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
50c0: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
50d0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
50e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
50f0: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
5100: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
5110: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
5120: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
5130: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
5140: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
5150: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
5160: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5170: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
5180: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
5190: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
51a0: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
51b0: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
51c0: 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  de);.}../* Forwa
51d0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
51e0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
51f0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
5200: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
5210: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
5220: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
5230: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
5240: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
5250: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
5260: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
5270: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
5280: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
5290: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
52a0: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
52b0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
52c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
52d0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
52e0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
52f0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
5300: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
5310: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
5320: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
5330: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
5340: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
5350: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5360: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
5370: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
5380: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
5390: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
53a0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
53b0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
53c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
53d0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
53e0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
53f0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
5400: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
5410: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5420: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
5430: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5440: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
5450: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5460: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
5470: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
5480: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
5490: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
54a0: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
54b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
54c0: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
54d0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
54e0: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
54f0: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
5500: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5510: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
5520: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
5530: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
5540: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
5550: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
5560: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
5570: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
5580: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5590: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
55a0: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
55b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
55c0: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
55d0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
55e0: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
55f0: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
5600: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5610: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
5620: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
5630: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
5640: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
5650: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
5660: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
5670: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
5680: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
5690: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
56a0: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
56b0: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
56c0: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
56d0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
56e0: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
56f0: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
5700: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
5710: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
5720: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
5730: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
5740: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
5750: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
5760: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
5770: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
5780: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
5790: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
57a0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
57b0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
57c0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
57d0: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
57e0: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
57f0: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
5800: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5810: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
5820: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
5830: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
5840: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
5850: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
5860: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
5870: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
5880: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5890: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
58a0: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
58b0: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
58c0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
58d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
58e0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
58f0: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
5900: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5910: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
5920: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
5930: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
5940: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
5950: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
5960: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
5970: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
5980: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
5990: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
59a0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
59b0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
59c0: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
59d0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
59e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
59f0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
5a00: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
5a10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
5a20: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
5a30: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5a40: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
5a50: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
5a60: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
5a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5a80: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
5a90: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
5aa0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
5ab0: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
5ac0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
5ad0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
5ae0: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
5af0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
5b00: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
5b10: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
5b20: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5b30: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
5b40: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
5b50: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
5b60: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5b70: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5b80: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5b90: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
5ba0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5bb0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
5bc0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5bd0: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
5be0: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
5bf0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5c00: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
5c10: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5c20: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
5c30: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5c40: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
5c50: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
5c60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5c70: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
5c80: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
5c90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
5ca0: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
5cb0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5cc0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
5cd0: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
5ce0: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
5cf0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5d00: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
5d10: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
5d20: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
5d30: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
5d40: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
5d50: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
5d60: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
5d70: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
5d80: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
5d90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
5da0: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
5db0: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
5dc0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5dd0: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
5de0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
5df0: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
5e00: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5e10: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
5e20: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
5e30: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
5e40: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
5e50: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
5e60: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
5e90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
5ea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
5eb0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
5ec0: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
5ed0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5ee0: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
5ef0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
5f00: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
5f10: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5f20: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
5f30: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
5f40: 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20  efine osFchmod  
5f50: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d    ((int(*)(int,m
5f60: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
5f70: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
5f80: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
5f90: 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
5fa0: 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
5fb0: 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61  ALLOCATE.  { "fa
5fc0: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
5fd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5fe0: 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  r)posix_fallocat
5ff0: 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  e,  0 },.#else. 
6000: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
6010: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6020: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6030: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6040: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
6050: 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28  Fallocate ((int(
6060: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66  *)(int,off_t,off
6070: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  _t))aSyscall[15]
6080: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6090: 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20  "unlink",       
60a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
60b0: 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20  _ptr)unlink,    
60c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
60d0: 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20  ine osUnlink    
60e0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
60f0: 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  har*))aSyscall[1
6100: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
6110: 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  { "openDirectory
6120: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
6130: 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44  yscall_ptr)openD
6140: 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30  irectory,      0
6150: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
6160: 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e  enDirectory ((in
6170: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
6180: 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  ,int*))aSyscall[
6190: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  17].pCurrent).. 
61a0: 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20   { "mkdir",     
61b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
61c0: 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20  all_ptr)mkdir,  
61d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
61e0: 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20  efine osMkdir   
61f0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
6200: 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61   char*,mode_t))a
6210: 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72  Syscall[18].pCur
6220: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69  rent)..  { "rmdi
6230: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
6240: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6250: 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  rmdir,          
6260: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
6270: 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Rmdir     ((int(
6280: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  *)(const char*))
6290: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
62a0: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
62b0: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
62c0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
62d0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
62e0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
62f0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
6300: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
6310: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
6320: 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20  * "unix" VFSes. 
6330: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6340: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
6350: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
6360: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
6370: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
6380: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
6390: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
63a0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
63b0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
63c0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
63d0: 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43  t unixSetSystemC
63e0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
63f0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
6400: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
6410: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
6420: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
6430: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
6440: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
6450: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
6460: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
6470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6480: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
6490: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
64a0: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
64b0: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
64c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
64d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
64e0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
64f0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6500: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
6510: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
6520: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
6530: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
6540: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
6550: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
6560: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
6570: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
6580: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
6590: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
65a0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
65b0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
65c0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
65d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
65e0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
65f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
6600: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6610: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
6620: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
6630: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6640: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
6650: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
6660: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
6670: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
6680: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
6690: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
66a0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
66b0: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
66c0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
66d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
66e0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
66f0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
6700: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
6710: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
6720: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
6730: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
6740: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
6750: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6760: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
6770: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6780: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
6790: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
67a0: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
67b0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
67c0: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
67d0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
67e0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
67f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6800: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6810: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6820: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
6830: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
6840: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
6850: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
6860: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
6870: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
6880: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
6890: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
68a0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
68b0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
68c0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
68d0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
68e0: 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79  ll_ptr unixGetSy
68f0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
6900: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
6910: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
6920: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
6930: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
6940: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6950: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
6960: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
6970: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
6980: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
6990: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
69a0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
69b0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
69c0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
69d0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
69e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
69f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6a00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
6a10: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
6a20: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
6a30: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
6a40: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
6a50: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
6a60: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
6a70: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
6a80: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
6a90: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
6aa0: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
6ab0: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
6ac0: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
6ad0: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
6ae0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
6af0: 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
6b00: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
6b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6b20: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
6b30: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
6b40: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
6b50: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
6b60: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6b70: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
6b80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6b90: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
6ba0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
6bb0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6bc0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
6bd0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
6be0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
6bf0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
6c00: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
6c10: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
6c20: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
6c30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6c40: 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29  .** Retry open()
6c50: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
6c60: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
6c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
6c80: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
6c90: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e  ar *z, int f, in
6ca0: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t m){.  int rc;.
6cb0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65    do{ rc = osOpe
6cc0: 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65  n(z,f,m); }while
6cd0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
6ce0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
6cf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6d00: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
6d10: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
6d20: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
6d30: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
6d40: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
6d50: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
6d60: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
6d70: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
6d80: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6d90: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
6da0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
6db0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
6dc0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
6dd0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
6de0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
6df0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
6e00: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
6e10: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
6e20: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
6e30: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
6e40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
6e50: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
6e60: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
6e70: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
6e80: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
6e90: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
6ea0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
6eb0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
6ec0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
6ed0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
6ee0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6ef0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
6f00: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
6f10: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6f20: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6f30: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
6f40: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
6f50: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
6f60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6f70: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
6f80: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
6f90: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
6fa0: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
6fb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
6fc0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
6fd0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
6fe0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
6ff0: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
7000: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
7010: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
7020: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
7030: 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  if...#if defined
7040: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
7050: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7060: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c  DEBUG)./*.** Hel
7070: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
7080: 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72   printing out tr
7090: 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ace information 
70a0: 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a  from debugging.*
70b0: 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73  * binaries. This
70c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
70d0: 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f  ing represetatio
70e0: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
70f0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
7100: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
7110: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
7120: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
7130: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
7140: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
7150: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
7160: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
7170: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
7180: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
7190: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
71a0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
71b0: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
71c0: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
71d0: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
71e0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
71f0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
7200: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
7210: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
7220: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
7230: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
7240: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
7250: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
7260: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
7270: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
7280: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7290: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
72a0: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
72b0: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
72c0: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
72d0: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
72e0: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
72f0: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
7300: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
7310: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
7320: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
7330: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
7340: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
7350: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
7360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
7370: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
7380: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
7390: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
73a0: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
73b0: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
73c0: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
73d0: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
73e0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
73f0: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
7400: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
7410: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
7420: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
7430: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
7440: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
7450: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
7460: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
7470: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
7480: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
7490: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
74a0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
74b0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
74c0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
74d0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
74e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
74f0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
7500: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
7510: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
7520: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
7530: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
7540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7550: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
7560: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
7570: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
7580: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
7590: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
75a0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
75b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
75c0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
75d0: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
75e0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
75f0: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
7600: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
7610: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
7620: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
7630: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
7640: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
7650: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
7660: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
7670: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
7680: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
7690: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
76a0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
76b0: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
76c0: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
76d0: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
76e0: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
76f0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
7700: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
7710: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
7720: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
7730: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
7740: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
7750: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
7760: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
7770: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
7780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7790: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
77a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
77b0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
77c0: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
77d0: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
77e0: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
77f0: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
7800: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
7810: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
7820: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
7830: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
7840: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
7850: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
7860: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
7870: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7880: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
7890: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
78a0: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
78b0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
78c0: 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69  INTR.*/.static i
78d0: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
78e0: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
78f0: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
7900: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
7910: 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68   = osFtruncate(h
7920: 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,sz); }while( rc
7930: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
7940: 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
7950: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
7960: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
7970: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
7980: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
7990: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
79a0: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
79b0: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
79c0: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
79d0: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
79e0: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
79f0: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
7a00: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
7a10: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
7a20: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
7a30: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
7a40: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
7a50: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
7a60: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
7a70: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
7a80: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
7a90: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
7aa0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
7ab0: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
7ac0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
7ad0: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
7ae0: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
7af0: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
7b00: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
7b10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7b20: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
7b30: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
7b40: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
7b50: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
7b60: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
7b70: 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20  r) {.#if 0.  /* 
7b80: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
7b90: 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63  s code was not c
7ba0: 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e  ommented out. In
7bb0: 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72   theory, this br
7bc0: 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  anch.  ** should
7bd0: 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61   never be hit, a
7be0: 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
7bf0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
7c00: 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a  alled after.  **
7c10: 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74   a locking-relat
7c20: 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  ed function (i.e
7c30: 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72  . fcntl()) has r
7c40: 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f  eturned non-zero
7c50: 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76   with.  ** the v
7c60: 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73  alue of errno as
7c70: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7c80: 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73  ent. Since a sys
7c90: 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69  tem call has fai
7ca0: 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20  led,.  ** errno 
7cb0: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65  should be non-ze
7cc0: 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  ro..  **.  ** De
7cd0: 73 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65  spite this, if e
7ce0: 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a  rrno really is z
7cf0: 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f  ero, we still do
7d00: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75  n't want to retu
7d10: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  rn.  ** SQLITE_O
7d20: 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61  K. The system ca
7d30: 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a  ll failed, and *
7d40: 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72  some* SQLite err
7d50: 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a  or should be.  *
7d60: 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63  * propagated bac
7d70: 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  k to the caller.
7d80: 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73   Commenting this
7d90: 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e   branch out mean
7da0: 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20  s errno==0.  ** 
7db0: 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20  will be handled 
7dc0: 62 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a  by the "default:
7dd0: 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20  " case below..  
7de0: 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20  */.  case 0: .  
7df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e00: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61  OK;.#endif..  ca
7e10: 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73  se EAGAIN:.  cas
7e20: 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63  e ETIMEDOUT:.  c
7e30: 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73  ase EBUSY:.  cas
7e40: 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20  e EINTR:.  case 
7e50: 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a  ENOLCK:  .    /*
7e60: 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72   random NFS retr
7e70: 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20  y error, unless 
7e80: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
7e90: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
7ea0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
7eb0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
7ec0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
7ed0: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20  t it says */.   
7ee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
7ef0: 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  USY;.    .  case
7f00: 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a   EACCES: .    /*
7f10: 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20   EACCES is like 
7f20: 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f  EAGAIN during lo
7f30: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
7f40: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74  , but not any ot
7f50: 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69  her time*/.    i
7f60: 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20  f( (sqliteIOErr 
7f70: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
7f80: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
7f90: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
7fa0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
7fb0: 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72  || ..(sqliteIOEr
7fc0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
7fd0: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73  R_RDLOCK) ||..(s
7fe0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
7ff0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
8000: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b  RESERVEDLOCK) ){
8010: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8020: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
8030: 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
8040: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63  l through */.  c
8050: 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20  ase EPERM: .    
8060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
8070: 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44  RM;.    .  /* ED
8080: 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f  EADLK is only po
8090: 73 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c  ssible if a call
80a0: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
80b0: 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64  KW) is made. And
80c0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c  .  ** this modul
80d0: 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75  e never makes su
80e0: 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74  ch a call. And t
80f0: 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74  he code in SQLit
8100: 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61  e itself .  ** a
8110: 73 73 65 72 74 73 20 74 68 61 74 20 53 51 4c 49  sserts that SQLI
8120: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
8130: 20 69 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e   is never return
8140: 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65  ed. For these re
8150: 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20  asons.  ** this 
8160: 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d  case is also com
8170: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74  mented out. If t
8180: 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  he system does s
8190: 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41  et errno to EDEA
81a0: 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65  DLK,.  ** the de
81b0: 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45  fault SQLITE_IOE
81c0: 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c  RR_XXX code will
81d0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f   be returned. */
81e0: 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20 45 44  .#if 0.  case ED
81f0: 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72  EADLK:.    retur
8200: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  n SQLITE_IOERR_B
8210: 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20  LOCKED;.#endif. 
8220: 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55     .#if EOPNOTSU
8230: 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61  PP!=ENOTSUP.  ca
8240: 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a  se EOPNOTSUPP: .
8250: 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67      /* something
8260: 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61   went terribly a
8270: 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  wry, unless duri
8280: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
8290: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
82a0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
82b0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
82c0: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
82d0: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
82e0: 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20  #ifdef ENOTSUP. 
82f0: 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a   case ENOTSUP: .
8300: 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66      /* invalid f
8310: 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  d, unless during
8320: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
8330: 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69  port introspecti
8340: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20  on, in which .  
8350: 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79     * it actually
8360: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
8370: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ays */.#endif.  
8380: 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65  case EIO:.  case
8390: 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45   EBADF:.  case E
83a0: 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e  INVAL:.  case EN
83b0: 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45  OTCONN:.  case E
83c0: 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e  NODEV:.  case EN
83d0: 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45  XIO:.  case ENOE
83e0: 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c  NT:.#ifdef ESTAL
83f0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
8400: 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20        /* ESTALE 
8410: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f  is not defined o
8420: 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d  n Interix system
8430: 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41  s */.  case ESTA
8440: 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73  LE:.#endif.  cas
8450: 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a  e ENOSYS:.    /*
8460: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f   these should fo
8470: 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rce the client t
8480: 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  o close the file
8490: 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a   and reconnect *
84a0: 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  /.    .  default
84b0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
84c0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
84d0: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
84e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
84f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8520: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
8530: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
8540: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
8550: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
8560: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
8570: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
8580: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
8590: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
85a0: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
85b0: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
85c0: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
85d0: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
85e0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
85f0: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
8600: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
8610: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
8620: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
8630: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
8640: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
8650: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
8660: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
8670: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
8680: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
8690: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
86a0: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
86b0: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
86c0: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
86d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
86e0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
86f0: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
8700: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
8710: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
8720: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
8730: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
8740: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
8750: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
8760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
8770: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
8780: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
8790: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
87a0: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
87b0: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
87c0: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
87d0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
87e0: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
87f0: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
8800: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
8810: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
8820: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
8830: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
8840: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
8850: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
8860: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
8870: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
8880: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
8890: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
88c0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
88d0: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
88e0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
88f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
8900: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
8910: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
8920: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
8930: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
8940: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
8950: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
8960: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
8970: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
8980: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
8990: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
89a0: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
89b0: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
89c0: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
89d0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
89e0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
89f0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
8a00: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
8a10: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
8a20: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
8a30: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
8a40: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
8a50: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
8a60: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
8a70: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
8a80: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
8a90: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
8aa0: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
8ab0: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
8ac0: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
8ad0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
8ae0: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
8af0: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
8b00: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
8b10: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
8b20: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
8b30: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
8b40: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
8b50: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
8b60: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
8b70: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
8b80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
8b90: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
8ba0: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
8bb0: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
8bc0: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
8bd0: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
8be0: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
8bf0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
8c00: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
8c10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
8c20: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
8c30: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
8c40: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
8c50: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
8c60: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
8c70: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
8c80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8c90: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
8ca0: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
8cb0: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
8cc0: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
8cd0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
8ce0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
8cf0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
8d00: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
8d10: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
8d20: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
8d30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8d40: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
8d50: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
8d60: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
8d70: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
8d80: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
8d90: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
8da0: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
8db0: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
8dc0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8dd0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
8de0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
8df0: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
8e00: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
8e10: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
8e20: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
8e30: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
8e40: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
8e50: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
8e60: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
8e70: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
8e80: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
8e90: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
8ea0: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
8eb0: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
8ec0: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
8ed0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8ee0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
8ef0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
8f00: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
8f10: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
8f20: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
8f30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
8f40: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
8f50: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
8f60: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
8f70: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
8f80: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
8f90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
8fa0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
8fb0: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
8fc0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
8fd0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
8fe0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9010: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
9020: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
9030: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
9040: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
9050: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
9060: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
9070: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
9080: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
9090: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31  of(*pNew) + (n+1
90a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
90b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
90c0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
90d0: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  lName = (char*)&
90e0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
90f0: 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  y(pNew->zCanonic
9100: 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74  alName, zAbsolut
9110: 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e  eName, n+1);.  n
9120: 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69   = vxworksSimpli
9130: 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61  fyName(pNew->zCa
9140: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b  nonicalName, n);
9150: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
9160: 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  r an existing en
9170: 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e  try that matchin
9180: 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  g the canonical 
9190: 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f  name..  ** If fo
91a0: 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  und, increment t
91b0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
91c0: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  nt and return a 
91d0: 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20  pointer to.  ** 
91e0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c  the existing fil
91f0: 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  e ID..  */.  uni
9200: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
9210: 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d   for(pCandidate=
9220: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
9230: 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61   pCandidate; pCa
9240: 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61  ndidate=pCandida
9250: 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  te->pNext){.    
9260: 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e  if( pCandidate->
9270: 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26  nName==n .     &
9280: 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64  & memcmp(pCandid
9290: 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  ate->zCanonicalN
92a0: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  ame, pNew->zCano
92b0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30  nicalName, n)==0
92c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
92d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
92e0: 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69  );.       pCandi
92f0: 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  date->nRef++;.  
9300: 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
9310: 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65  tex();.       re
9320: 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b  turn pCandidate;
9330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9340: 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f   No match was fo
9350: 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61  und.  We will ma
9360: 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44  ke a new file ID
9370: 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66   */.  pNew->nRef
9380: 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e   = 1;.  pNew->nN
9390: 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d  ame = n;.  pNew-
93a0: 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73  >pNext = vxworks
93b0: 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f  FileList;.  vxwo
93c0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e  rksFileList = pN
93d0: 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ew;.  unixLeaveM
93e0: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
93f0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
9400: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
9410: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
9420: 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64   a vxworksFileId
9430: 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a   object.  Free.*
9440: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65  * the object whe
9450: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
9460: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
9470: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ro..*/.static vo
9480: 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  id vxworksReleas
9490: 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76  eFileId(struct v
94a0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
94b0: 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d){.  unixEnterM
94c0: 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
94d0: 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pId->nRef>0 );
94e0: 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pId->nRef--;.
94f0: 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d    if( pId->nRef=
9500: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
9510: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
9520: 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  *pp;.    for(pp=
9530: 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  &vxworksFileList
9540: 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49  ; *pp && *pp!=pI
9550: 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d  d; pp = &((*pp)-
9560: 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61  >pNext)){}.    a
9570: 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20  ssert( *pp==pId 
9580: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64  );.    *pp = pId
9590: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
95a0: 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a  ite3_free(pId);.
95b0: 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
95c0: 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66  utex();.}.#endif
95d0: 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
95e0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
95f0: 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65  ** End of Unique
9600: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
9610: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
9620: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
9630: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9680: 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96d0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
96e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
96f0: 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
9700: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
9710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9720: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20  ***.**.** POSIX 
9730: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
9740: 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73  re broken by des
9750: 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31  ign.  ANSI STD 1
9760: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
9770: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
9780: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
9790: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
97a0: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
97b0: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
97c0: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
97d0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
97e0: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
97f0: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
9800: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
9810: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
9820: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
9830: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
9840: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
9850: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
9860: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
9870: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
9880: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
9890: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
98a0: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
98b0: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
98c0: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
98d0: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
98e0: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
98f0: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
9900: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
9910: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
9920: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
9930: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
9940: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
9950: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
9960: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
9970: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
9980: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
9990: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
99a0: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
99b0: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
99c0: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
99d0: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
99e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
99f0: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
9a00: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
9a10: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
9a20: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
9a30: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
9a40: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
9a50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
9a60: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
9a70: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
9a80: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
9a90: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
9aa0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
9ab0: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
9ac0: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
9ad0: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
9ae0: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
9af0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
9b00: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
9b10: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
9b20: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  es..**.** This m
9b30: 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e  eans that we can
9b40: 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f  not use POSIX lo
9b50: 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  cks to synchroni
9b60: 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a  ze file access.*
9b70: 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e  * among competin
9b80: 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65  g threads of the
9b90: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
9ba0: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c  POSIX locks will
9bb0: 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f   work fine.** to
9bc0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63   synchronize acc
9bd0: 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20  ess for threads 
9be0: 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  in separate proc
9bf0: 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a  esses, but not.*
9c00: 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e  * threads within
9c10: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
9c20: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  s..**.** To work
9c30: 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62   around the prob
9c40: 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lem, SQLite has 
9c50: 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c  to manage file l
9c60: 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  ocks internally.
9c70: 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20  ** on its own.  
9c80: 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64  Whenever a new d
9c90: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
9ca0: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  d, we have to fi
9cb0: 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  nd the.** specif
9cc0: 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20  ic inode of the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
9ce0: 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65  he inode is dete
9cf0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  rmined by the.**
9d00: 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69   st_dev and st_i
9d10: 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  no fields of the
9d20: 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20   stat structure 
9d30: 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c  that fstat() fil
9d40: 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68  ls in).** and ch
9d50: 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c  eck for locks al
9d60: 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f  ready existing o
9d70: 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57  n that inode.  W
9d80: 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  hen locks are.**
9d90: 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f   created or remo
9da0: 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ved, we have to 
9db0: 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20  look at our own 
9dc0: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
9dd0: 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20  of the.** locks 
9de0: 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
9df0: 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65  r thread has pre
9e00: 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f  viously set a lo
9e10: 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a  ck on that same.
9e20: 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ** inode..**.** 
9e30: 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20  (Aside: The use 
9e40: 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73  of inode numbers
9e50: 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64   as unique IDs d
9e60: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
9e70: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20  VxWorks..** For 
9e80: 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65  VxWorks, we have
9e90: 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65   to use the alte
9ea0: 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49  rnative unique I
9eb0: 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f  D system based o
9ec0: 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66  n.** canonical f
9ed0: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c  ilename and impl
9ee0: 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70  emented in the p
9ef0: 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e  revious division
9f00: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  .).**.** The sql
9f10: 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
9f20: 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73  ure for POSIX is
9f30: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20   no longer just 
9f40: 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  an integer file.
9f50: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  ** descriptor.  
9f60: 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75  It is now a stru
9f70: 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73  cture that holds
9f80: 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c   the integer fil
9f90: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
9fa0: 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
9fb0: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
9fc0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
9fd0: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b  internal.** lock
9fe0: 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s on the corresp
9ff0: 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54  onding inode.  T
a000: 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b  here is one lock
a010: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ing structure.**
a020: 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69   per inode, so i
a030: 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  f the same inode
a040: 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65   is opened twice
a050: 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20  , both unixFile 
a060: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
a070: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
a080: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
a090: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
a0a0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
a0b0: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
a0c0: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
a0d0: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
a0e0: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
a0f0: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
a100: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
a110: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
a120: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
a130: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
a140: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
a150: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
a160: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
a170: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
a180: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
a190: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
a1a0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
a1b0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
a1c0: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
a1d0: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
a1e0: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
a1f0: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
a200: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
a210: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
a220: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
a230: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
a240: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
a250: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
a260: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
a270: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
a280: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
a290: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
a2a0: 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65  * But wait:  the
a2b0: 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20  re are yet more 
a2c0: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f  problems with PO
a2d0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
a2e0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75  ks..**.** If you
a2f0: 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   close a file de
a300: 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f  scriptor that po
a310: 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74  ints to a file t
a320: 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a  hat has locks,.*
a330: 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74  * all locks on t
a340: 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
a350: 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  e owned by the c
a360: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
a370: 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20  re.** released. 
a380: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
a390: 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61  this problem, ea
a3a0: 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ch unixInodeInfo
a3b0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74   object.** maint
a3c0: 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  ains a count of 
a3d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65  the number of pe
a3e0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74  nding locks on t
a3f0: 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65  ha inode..** Whe
a400: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
a410: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
a420: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
a430: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
a440: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
a450: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
a460: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
a470: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
a480: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
a490: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a4a0: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
a4b0: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
a4c0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
a4d0: 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   The unixInodeIn
a4e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  fo structure kee
a4f0: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
a500: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
a510: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
a520: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
a530: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
a540: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
a550: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
a560: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
a570: 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72  * Yet another pr
a580: 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72  oblem:  LinuxThr
a590: 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79  eads do not play
a5a0: 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78   well with posix
a5b0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61   locks..**.** Ma
a5c0: 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  ny older version
a5d0: 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74  s of linux use t
a5e0: 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  he LinuxThreads 
a5f0: 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73  library which is
a600: 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f  .** not posix co
a610: 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20  mpliant.  Under 
a620: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20  LinuxThreads, a 
a630: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
a640: 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e  thread.** A cann
a650: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f  ot be modified o
a660: 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  r overridden by 
a670: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
a680: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ad B..** Only th
a690: 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66  read A can modif
a6a0: 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63  y the lock.  Loc
a6b0: 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73  king behavior is
a6c0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74   correct.** if t
a6d0: 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73  he appliation us
a6e0: 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74  es the newer Nat
a6f0: 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64  ive Posix Thread
a700: 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a   Library (NPTL).
a710: 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69  ** on linux - wi
a720: 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63  th NPTL a lock c
a730: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
a740: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
a750: 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65  locks.** in thre
a760: 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65  ad B.  But there
a770: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
a780: 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ow at compile-ti
a790: 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65  me which.** thre
a7a0: 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73  ading library is
a7b0: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f   being used.  So
a7c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
a7d0: 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63   to know at.** c
a7e0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
a7f0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
a800: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
a810: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64   locks on thread
a820: 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74   B..** One has t
a830: 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20  o do a run-time 
a840: 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65  check to discove
a850: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
a860: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
a870: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
a880: 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73  SQLite used to s
a890: 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65  upport LinuxThre
a8a0: 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72  ads.  But suppor
a8b0: 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61  t for LinuxThrea
a8c0: 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65  ds.** was droppe
a8d0: 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  d beginning with
a8e0: 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20   version 3.7.0. 
a8f0: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69   SQLite will sti
a900: 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  ll work with.** 
a910: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f  LinuxThreads pro
a920: 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74  vided that (1) t
a930: 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20  here is no more 
a940: 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74  than one connect
a950: 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61  ion .** per data
a960: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
a970: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e   same process an
a980: 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63  d (2) database c
a990: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f  onnections.** do
a9a0: 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73   not move across
a9b0: 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a   threads..*/../*
a9c0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
a9d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
a9e0: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
a9f0: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
aa00: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
aa10: 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78   particular unix
aa20: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
aa30: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
aa40: 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74  FileId {.  dev_t
aa50: 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   dev;           
aa60: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
aa70: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f   number */.#if O
aa80: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
aa90: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
aaa0: 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75   *pId;  /* Uniqu
aab0: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78  e file ID for vx
aac0: 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  works. */.#else.
aad0: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aaf0: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
ab00: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
ab10: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
ab20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ab30: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
ab40: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
ab50: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f  pen.** inode.  O
ab60: 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61  r, on LinuxThrea
ab70: 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ds, there is one
ab80: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
ab90: 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ures for.** each
aba0: 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79   inode opened by
abb0: 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a   each thread..**
abc0: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
abd0: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
abe0: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
abf0: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
ac00: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
ac10: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
ac20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
ac30: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
ac40: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
ac50: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
ac60: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
ac70: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
ac80: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
ac90: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
aca0: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
acb0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
acc0: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
acd0: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
ace0: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ad10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
ad20: 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ld */.  unsigned
ad30: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
ad40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
ad50: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
ad60: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
ad70: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
ad80: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
ad90: 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63  k;     /* An exc
ada0: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
adb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
adc0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
adf0: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
ae00: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
ae10: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
ae20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
ae30: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
ae40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ae50: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
ae60: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
ae90: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
aea0: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
aeb0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
aec0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
aed0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
aee0: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
aef0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
af00: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
af10: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
af20: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
af30: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
af40: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
af50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
af60: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
af70: 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ked */.#if SQLIT
af80: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
af90: 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65  _STYLE.  unsigne
afa0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
afb0: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
afc0: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
afd0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
afe0: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
aff0: 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  KS.  sem_t *pSem
b000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f       /* Named PO
b020: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  SIX semaphore */
b030: 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65  .  char aSemName
b040: 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
b050: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
b060: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
b070: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
b080: 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20   A lists of all 
b090: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
b0a0: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
b0b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b0c0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  inodeList = 0;..
b0d0: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
b0e0: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
b0f0: 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e  Error_x(), is on
b100: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
b110: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
b120: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
b130: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
b140: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
b150: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
b160: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
b170: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
b180: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
b190: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
b1a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
b1b0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
b1c0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
b1d0: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
b1e0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
b1f0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
b200: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
b210: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
b220: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
b230: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
b240: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
b250: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
b260: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
b270: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
b280: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
b290: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
b2a0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
b2b0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
b2c0: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
b2d0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
b2e0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
b2f0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
b300: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
b310: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
b320: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
b330: 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69  d the the associ
b340: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
b350: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
b360: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
b370: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
b380: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
b390: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
b3a0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
b3b0: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
b3c0: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
b3d0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
b3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
b3f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
b400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b410: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
b420: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
b430: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
b440: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
b450: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
b460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b470: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
b480: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
b490: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
b4c0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
b4d0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
b4e0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
b4f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b500: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
b510: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
b520: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
b530: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
b540: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
b550: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
b560: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
b570: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
b580: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
b590: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
b5a0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
b5b0: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
b5c0: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
b5d0: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
b5e0: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
b5f0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
b600: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
b610: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
b620: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
b630: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
b640: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
b650: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
b660: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
b670: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
b680: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
b690: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
b6a0: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
b6b0: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
b6c0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
b6d0: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
b6e0: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
b6f0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
b700: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
b710: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
b720: 70 72 6f 76 69 64 65 73 20 74 68 65 20 74 68 65  provides the the
b730: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
b740: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
b750: 74 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  t .  ** returns 
b760: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
b770: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
b780: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
b790: 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72  ge. That pointer
b7a0: 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74   .  ** may point
b7b0: 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69   to aErr[], or i
b7c0: 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73  t may point to s
b7d0: 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61  ome static stora
b7e0: 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20  ge somewhere. . 
b7f0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
b800: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
b810: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
b820: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
b830: 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72   of .  ** strerr
b840: 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c  or_r(), which al
b850: 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65  ways writes an e
b860: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
b870: 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20  o aErr[]..  **. 
b880: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20   ** If the code 
b890: 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75  incorrectly assu
b8a0: 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74  mes that it is t
b8b0: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
b8c0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76   that is.  ** av
b8d0: 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72  ailable, the err
b8e0: 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
b8f0: 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74  often be an empt
b900: 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a  y string. Not a.
b910: 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65    ** huge proble
b920: 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63  m. Incorrectly c
b930: 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74  oncluding that t
b940: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69  he GNU version i
b950: 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a  s available .  *
b960: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
b970: 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67  a segfault thoug
b980: 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  h..  */.#if defi
b990: 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43  ned(STRERROR_R_C
b9a0: 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65  HAR_P) || define
b9b0: 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a  d(__USE_GNU).  z
b9c0: 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20  Err = .# endif. 
b9d0: 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72   strerror_r(iErr
b9e0: 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66  no, aErr, sizeof
b9f0: 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69  (aErr)-1);..#eli
ba00: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
ba10: 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  AFE.  /* This is
ba20: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
ba30: 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f  ild, but strerro
ba40: 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61  r_r() is not ava
ba50: 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72  ilable. */.  zEr
ba60: 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20  r = "";.#else.  
ba70: 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66  /* Non-threadsaf
ba80: 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72  e build, use str
ba90: 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45  error(). */.  zE
baa0: 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45  rr = strerror(iE
bab0: 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  rrno);.#endif.. 
bac0: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
bad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
bae0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
baf0: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71  zPath = "";.  sq
bb00: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
bb10: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69  e,.      "os_uni
bb20: 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  x.c:%d: (%d) %s(
bb30: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
bb40: 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20   iLine, iErrno, 
bb50: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45  zFunc, zPath, zE
bb60: 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  rr.  );..  retur
bb70: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
bb80: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bb90: 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
bba0: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61  ** We assume tha
bbb0: 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74  t close() almost
bbc0: 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73   always works, s
bbd0: 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20  ince it is only 
bbe0: 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63  in a.** very sic
bbf0: 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72  k application or
bc00: 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20   on a very sick 
bc10: 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74  platform that it
bc20: 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20   might fail..** 
bc30: 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c  If it does fail,
bc40: 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65   simply leak the
bc50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bc60: 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65  , but do log the
bc70: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
bc80: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
bc90: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74   not safe to ret
bca0: 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72  ry close() after
bcb0: 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65   EINTR since the
bcc0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
bcd0: 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61  tor might have a
bce0: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73  lready been reus
bcf0: 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68  ed by another th
bd00: 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64  read..** So we d
bd10: 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f  on't even try to
bd20: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e   recover from an
bd30: 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f   EINTR.  Just lo
bd40: 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61  g the error.** a
bd50: 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73  nd move on..*/.s
bd60: 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73  tatic void robus
bd70: 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65  t_close(unixFile
bd80: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20   *pFile, int h, 
bd90: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69  int lineno){.  i
bda0: 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b  f( osClose(h) ){
bdb0: 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
bdc0: 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49  rAtLine(SQLITE_I
bdd0: 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f  OERR_CLOSE, "clo
bde0: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se",.           
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
be00: 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e ? pFile->zPath
be10: 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20   : 0, lineno);. 
be20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
be30: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
be40: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
be50: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
be60: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
be70: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
be80: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
be90: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
bea0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
beb0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
bec0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
bed0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
bee0: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
bef0: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
bf00: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
bf10: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
bf20: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
bf30: 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53 43 4c 4f  pNext;.#if OSCLO
bf40: 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49  SE_CHECK_CLOSE_I
bf50: 4f 45 52 52 0a 20 20 20 20 69 66 28 20 63 6c 6f  OERR.    if( clo
bf60: 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20  se(p->fd) ){.   
bf70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
bf80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
bf90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
bfa0: 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
bfb0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72    p->pNext = pEr
bfc0: 72 6f 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f  ror;.      pErro
bfd0: 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65  r = p;.    }else
bfe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
bff0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23  free(p);.    }.#
c000: 65 6c 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f  else.    robust_
c010: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
c020: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
c030: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c040: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  p);.#endif.  }. 
c050: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
c060: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
c070: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
c080: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
c090: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
c0a0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
c0b0: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
c0c0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
c0d0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
c0e0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
c0f0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
c100: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
c110: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c120: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
c130: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
c140: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
c150: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
c160: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
c170: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
c180: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
c190: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
c1a0: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
c1b0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
c1c0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
c1d0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
c1e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c1f0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
c200: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
c210: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
c220: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
c230: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
c240: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c250: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
c260: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
c270: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
c280: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
c290: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
c2a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c2b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
c2c0: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
c2d0: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
c2e0: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
c2f0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
c300: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
c310: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
c320: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
c330: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
c340: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
c350: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
c360: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
c370: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
c380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c390: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
c3a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
c3b0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
c3c0: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
c3d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
c3e0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
c3f0: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
c400: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
c410: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
c420: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
c430: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
c440: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
c450: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
c460: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
c470: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
c480: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
c490: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
c4a0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
c4b0: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
c4c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c4d0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
c4e0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
c4f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
c500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
c510: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
c520: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
c550: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
c560: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
c570: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
c580: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
c590: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
c5a0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
c5b0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
c5c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c5e0: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
c5f0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c600: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
c610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c620: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c630: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
c640: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
c650: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
c660: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
c670: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
c680: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
c690: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
c6a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
c6b0: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
c6c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
c6d0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c6e0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
c6f0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
c700: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
c710: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c720: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
c730: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
c740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
c750: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
c760: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
c770: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
c780: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
c790: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
c7a0: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
c7b0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
c7c0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
c7d0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
c7e0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c7f0: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
c800: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
c810: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
c820: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
c830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c840: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
c850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c860: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
c870: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
c880: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
c890: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
c8a0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
c8b0: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
c8c0: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
c8d0: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
c8e0: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
c8f0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
c900: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
c910: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
c920: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
c930: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
c940: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
c950: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
c960: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
c970: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
c980: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
c990: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
c9a0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
c9b0: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
c9c0: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
c9d0: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
c9e0: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
c9f0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
ca00: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
ca10: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
ca20: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
ca30: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
ca40: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
ca50: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
ca60: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
ca70: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
ca80: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
ca90: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
caa0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
cab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
cac0: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
cad0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
cae0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
caf0: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
cb00: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
cb10: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
cb20: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
cb30: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
cb40: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
cb50: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
cb60: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
cb70: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=1 ){.      pFi
cb80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
cb90: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
cba0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
cbb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
cbc0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
cbd0: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
cbe0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rc!=0 ){.      p
cbf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cc00: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
cc10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
cc20: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
cc30: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
cc40: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
cc50: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
cc60: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
cc70: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
cc80: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
cc90: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
cca0: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
ccb0: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
ccc0: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
ccd0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
cce0: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
ccf0: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
cd00: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
cd10: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
cd20: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
cd30: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
cd40: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
cd50: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
cd60: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
cd70: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
cd80: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
cd90: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
cda0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
cdb0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
cdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
cdd0: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
cde0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
cdf0: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
ce00: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
ce10: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
ce20: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
ce30: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
ce40: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
ce50: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
ce60: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
ce70: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
ce80: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
ce90: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
cea0: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
ceb0: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
cec0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
ced0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
cee0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
cef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
cf10: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
cf20: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
cf30: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
cf40: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
cf50: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
cf60: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
cf70: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
cf80: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
cf90: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
cfa0: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
cfb0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
cfc0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
cfd0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
cfe0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
cff0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
d000: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
d010: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
d020: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
d030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
d040: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
d050: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
d060: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
d070: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
d090: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
d0a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
d0b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
d0c0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
d0d0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
d0e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
d0f0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
d100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d110: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
d120: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
d130: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
d140: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
d150: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
d160: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
d170: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
d180: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
d190: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
d1a0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
d1b0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
d1c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
d1d0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
d1e0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
d1f0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
d200: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
d210: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
d220: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
d230: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
d240: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
d250: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
d260: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
d270: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
d280: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
d290: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
d2a0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
d2b0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d2c0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
d2d0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
d2e0: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
d2f0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
d300: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
d310: 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
d320: 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
d330: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
d340: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d350: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d360: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d370: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d380: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
d390: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69  LOCK);.      pFi
d3a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d3b0: 74 45 72 72 6e 6f 3b 0a 23 65 6c 73 65 0a 20 20  tErrno;.#else.  
d3c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d3d0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
d3e0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  VEDLOCK;.      p
d3f0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d400: 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a  = errno;.#endif.
d410: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
d420: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
d430: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
d440: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
d450: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
d460: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
d470: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
d480: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
d490: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
d4a0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
d4b0: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
d4c0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
d4d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d4e0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
d4f0: 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d  to set a system-
d500: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
d510: 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63   pFile.  The loc
d520: 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62  k is .** describ
d530: 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a  ed by pLock..**.
d540: 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20  ** If the pFile 
d550: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  was opened read/
d560: 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d  write from unix-
d570: 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f  excl, then the o
d580: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72  nly lock.** ever
d590: 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20   obtained is an 
d5a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
d5b0: 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e  and it is obtain
d5c0: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a  ed exactly once.
d5d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ** the first tim
d5e0: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
d5f0: 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75  tempted.  All su
d600: 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20  bsequent system 
d610: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  locking.** opera
d620: 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d  tions become no-
d630: 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70  ops.  Locking op
d640: 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68  erations still h
d650: 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  appen internally
d660: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
d670: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65   coordinate acce
d680: 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72  ss between separ
d690: 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ate database con
d6a0: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68  nections.** with
d6b0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
d6c0: 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74   but all of that
d6d0: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d   is handled in m
d6e0: 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a  emory and the.**
d6f0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
d700: 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69  m does not parti
d710: 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cipate..**.** Th
d720: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
d730: 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f   pass-through to
d740: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20   fcntl(F_SETLK) 
d750: 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e  if pFile is usin
d760: 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68  g.** any VFS oth
d770: 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78  er than "unix-ex
d780: 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20  cl" or if pFile 
d790: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e  is opened on "un
d7a0: 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20  ix-excl".** and 
d7b0: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a  is read-only..**
d7c0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
d7d0: 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  rned if the call
d7e0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
d7f0: 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69  ssfully, or -1 i
d800: 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  f a call.** to f
d810: 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e  cntl() fails. In
d820: 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e   this case, errn
d830: 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72  o is set appropr
d840: 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c  iately (by fcntl
d850: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
d860: 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  nt unixFileLock(
d870: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
d880: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
d890: 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79  Lock, int nRetry
d8a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
d8b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d8c0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d8d0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
d8e0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
d8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
d900: 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ode!=0 );.  if( 
d910: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
d920: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs & UNIXFILE_EX
d930: 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65  CL)!=0 || pInode
d940: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a  ->bProcessLock).
d950: 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63     && ((pFile->c
d960: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
d970: 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a  ILE_RDONLY)==0).
d980: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e    ){.    if( pIn
d990: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d9a0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
d9b0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d9c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d9d0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
d9e0: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
d9f0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
da00: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
da10: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
da20: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
da30: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
da40: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
da50: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
da60: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
da70: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
da80: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
da90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
daa0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dab0: 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63     pInode->bProc
dac0: 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  essLock = 1;.   
dad0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
dae0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
daf0: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
db00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
db10: 69 6e 74 20 69 20 3d 20 30 3b 20 20 20 20 20 20  int i = 0;      
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
db40: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
db50: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
db60: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66  pLock);.      if
db70: 28 20 72 63 20 26 26 20 6e 52 65 74 72 79 20 29  ( rc && nRetry )
db80: 7b 0a 20 20 20 20 20 20 20 20 20 75 73 6c 65 65  {.         uslee
db90: 70 28 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a  p(100 * (++i));.
dba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
dbb0: 6c 65 28 20 21 72 63 20 26 26 20 6e 52 65 74 72  le( !rc && nRetr
dbc0: 79 2d 2d 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  y-- );.  }.  ret
dbd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
dbe0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
dbf0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
dc00: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
dc10: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
dc20: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
dc30: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
dc40: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
dc50: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
dc60: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
dc70: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
dc80: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
dc90: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
dca0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
dcb0: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
dcc0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
dcd0: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
dce0: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
dcf0: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
dd00: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
dd10: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
dd20: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
dd30: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
dd40: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
dd50: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
dd60: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
dd70: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
dd80: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
dd90: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
dda0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
ddb0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
ddc0: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
ddd0: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
dde0: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
ddf0: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
de00: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
de10: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
de20: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
de30: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
de40: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
de50: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
de60: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
de70: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
de80: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
de90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dea0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
deb0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
dec0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
ded0: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
dee0: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
def0: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
df00: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
df10: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
df20: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
df30: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
df40: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
df50: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
df60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
df70: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
df80: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
df90: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
dfa0: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
dfb0: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
dfc0: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
dfd0: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
dfe0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
dff0: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
e000: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
e010: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
e020: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
e030: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
e040: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
e050: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
e060: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
e070: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
e080: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
e090: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
e0a0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
e0b0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
e0c0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
e0d0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
e0e0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
e0f0: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
e100: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
e110: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
e120: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
e130: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
e140: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
e150: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
e160: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
e170: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
e180: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
e190: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
e1a0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
e1b0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
e1c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
e1d0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
e1e0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
e1f0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
e200: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
e210: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
e220: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
e230: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
e240: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
e250: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
e260: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
e270: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
e280: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
e290: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
e2a0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
e2b0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
e2c0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
e2d0: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
e2e0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
e2f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
e300: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
e310: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
e320: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
e330: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
e340: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
e350: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
e360: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
e370: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
e380: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
e390: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
e3a0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
e3b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
e3c0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
e3d0: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
e3e0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
e3f0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
e400: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
e410: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
e420: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
e430: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
e440: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
e450: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
e460: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
e470: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
e480: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
e490: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
e4a0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
e4b0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
e4c0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
e4d0: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
e4e0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
e4f0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
e500: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
e510: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
e520: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
e530: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
e540: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
e550: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
e560: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
e570: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
e580: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
e590: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
e5a0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
e5b0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
e5c0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
e5d0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
e5e0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
e5f0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
e600: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
e610: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
e620: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
e630: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
e640: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
e650: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
e660: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
e670: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
e680: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
e690: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
e6a0: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
e6b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
e6c0: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
e6d0: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
e6e0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
e6f0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
e700: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
e710: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
e720: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
e730: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
e740: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
e750: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
e760: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
e770: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e780: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
e790: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e7a0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
e7b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
e7c0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
e7d0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
e7e0: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
e7f0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
e800: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
e810: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
e820: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
e830: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
e840: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
e850: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
e860: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
e870: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
e880: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
e890: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
e8a0: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
e8b0: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
e8c0: 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
e8d0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
e8e0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
e8f0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
e900: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
e910: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
e920: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
e930: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
e940: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
e950: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
e960: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
e970: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
e980: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
e990: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e9a0: 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
e9b0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
e9c0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
e9d0: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
e9e0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e9f0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
ea00: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
ea10: 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
ea20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ea30: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
ea40: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
ea50: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
ea60: 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
ea70: 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
ea80: 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
ea90: 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
eaa0: 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
eab0: 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
eac0: 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
ead0: 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
eae0: 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
eaf0: 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
eb00: 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
eb10: 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
eb20: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
eb30: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eb40: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
eb50: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
eb60: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
eb70: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
eb80: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
eb90: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
eba0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
ebb0: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
ebc0: 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
ebd0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ebe0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
ebf0: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
ec00: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
ec10: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
ec20: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
ec30: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
ec40: 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
ec50: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ec60: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
ec70: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
ec80: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
ec90: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
eca0: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
ecb0: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
ecc0: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
ecd0: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
ece0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
ecf0: 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
ed00: 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
ed10: 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
ed20: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
ed30: 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
ed40: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
ed50: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
ed60: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
ed70: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
ed80: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
ed90: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
eda0: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
edb0: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
edc0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
edd0: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
ede0: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
edf0: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
ee00: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
ee10: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
ee20: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
ee30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
ee40: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
ee50: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
ee60: 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65  & .      (pInode
ee70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
ee80: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
ee90: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
eea0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
eeb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
eec0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
eed0: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
eee0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
eef0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
ef00: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
ef10: 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
ef20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ef30: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
ef40: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
ef50: 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
ef60: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
ef70: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
ef80: 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  }...  /* A PENDI
ef90: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
efa0: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
efb0: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
efc0: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
efd0: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
efe0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
eff0: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
f000: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
f010: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
f020: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  eased..  */.  lo
f030: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
f040: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f050: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
f060: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
f070: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
f080: 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
f090: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f0a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f0b0: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
f0c0: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
f0d0: 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b  ype = (eFileLock
f0e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
f0f0: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
f100: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f110: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f120: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
f130: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f140: 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  ck, 0) ){.      
f150: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f170: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f180: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f190: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
f1a0: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
f1b0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
f1c0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f1d0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
f1e0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
f1f0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
f200: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
f210: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
f220: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
f230: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
f240: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
f250: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
f260: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
f270: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
f280: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
f290: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
f2a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
f2b0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
f2c0: 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
f2d0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
f2e0: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
f2f0: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
f300: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
f310: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
f320: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
f330: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f340: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f350: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f360: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f370: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f380: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
f390: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
f3a0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f3b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f3c0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f3d0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f3e0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
f3f0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
f400: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
f410: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
f420: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f430: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
f440: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
f450: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
f460: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f470: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f480: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
f490: 20 31 30 29 20 26 26 20 72 63 3d 3d 53 51 4c 49   10) && rc==SQLI
f4a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
f4b0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
f4c0: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
f4d0: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
f4e0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f4f0: 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  ;.#if OSLOCKING_
f500: 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
f510: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f520: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f530: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f540: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f550: 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20 20  K); .#else.     
f560: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f570: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64  RR_UNLOCK; .#end
f580: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  if.    }..    if
f590: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
f5a0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f5b0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
f5c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f5d0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f5e0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
f5f0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
f600: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
f610: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
f620: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
f630: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
f640: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
f650: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
f660: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
f670: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
f680: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
f690: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
f6a0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
f6b0: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
f6c0: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
f6d0: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
f6e0: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
f6f0: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
f700: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
f710: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
f720: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f740: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
f750: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
f760: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
f770: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
f780: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
f790: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
f7a0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
f7b0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
f7c0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
f7d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
f7e0: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
f7f0: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
f800: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
f810: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
f820: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
f830: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
f840: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
f850: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
f860: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
f870: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
f880: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f890: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
f8a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f8b0: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
f8c0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
f8d0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f8e0: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
f8f0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f900: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
f910: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f920: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29  pFile, &lock, 0)
f930: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
f940: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f950: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f960: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f970: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f980: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
f990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f9a0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f9b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f9c0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f9d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
f9e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
f9f0: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
fa00: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
fa10: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
fa20: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
fa30: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
fa40: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
fa50: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
fa60: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
fa70: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
fa80: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
fa90: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
faa0: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
fab0: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
fac0: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
fad0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
fae0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
faf0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
fb00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
fb10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
fb20: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
fb30: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
fb40: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
fb50: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
fb60: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
fb70: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
fb80: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
fb90: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
fba0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
fbb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
fbc0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
fbd0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
fbe0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
fbf0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
fc00: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
fc10: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
fc20: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
fc30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
fc40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
fc50: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
fc60: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
fc70: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
fc80: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
fc90: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
fca0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
fcb0: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
fcc0: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
fcd0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
fce0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
fcf0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
fd00: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
fd10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
fd20: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
fd30: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
fd40: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
fd50: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
fd60: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
fd70: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
fd80: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
fd90: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
fda0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
fdb0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
fdc0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
fdd0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
fde0: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
fdf0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
fe00: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
fe10: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
fe20: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
fe30: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
fe40: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
fe50: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
fe60: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
fe70: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
fe80: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
fe90: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
fea0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
feb0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
fec0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
fed0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
fee0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
fef0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ff00: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
ff10: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
ff20: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
ff30: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
ff40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
ff50: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
ff60: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
ff70: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
ff80: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
ff90: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
ffa0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
ffb0: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
ffc0: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
ffd0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
ffe0: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
fff0: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
10000 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
10010 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
10020 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
10030 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
10040 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
10050 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
10060 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
10070 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
10080 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
10090 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
100a0 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
100b0 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
100c0 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
100d0 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
100e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
100f0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
10100 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
10110 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
10120 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10130 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
10140 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
10150 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
10160 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
10170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
10180 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10190 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
101a0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
101b0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
101c0 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
101d0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
101e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
101f0 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
10200 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
10210 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10220 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
10230 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
10240 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
10250 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10260 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10270 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
10280 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
10290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
102a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
102b0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
102c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
102d0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
102e0 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
102f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10300 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
10310 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10320 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10330 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
10340 63 6b 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  ck );..#ifndef N
10350 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
10360 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
10370 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
10380 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
10390 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
103a0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
103b0 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
103c0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
103d0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
103e0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
103f0 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
10400 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
10410 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
10420 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
10430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
10440 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
10450 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
10460 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
10470 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
10480 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
10490 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
104a0 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
104b0 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
104c0 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
104d0 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
104e0 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
104f0 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
10500 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
10510 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
10520 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
10530 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
10540 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
10550 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
10560 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
10570 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
10580 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
10590 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
105a0 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
105b0 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
105c0 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
105d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
105e0 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
105f0 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
10600 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
10610 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
10620 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
10630 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
10640 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
10650 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
10660 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
10670 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
10680 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
10690 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
106a0 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
106b0 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
106c0 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
106d0 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
106e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
106f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
10700 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
10710 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
10720 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
10730 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 23 69 66  l errors */..#if
10740 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
10750 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
10760 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10770 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
10780 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
10790 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
107a0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
107b0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
107c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
107d0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
107e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
107f0 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
10800 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
10810 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
10820 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
10830 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
10840 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
10850 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
10860 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10870 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10880 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10890 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
108a0 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
108b0 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
108c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
108d0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
108e0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
108f0 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
10900 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
10910 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
10920 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
10930 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
10940 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10950 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10960 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10970 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
10980 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10990 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
109a0 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
109b0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
109c0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
109d0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
109e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
109f0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
10a00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10a10 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
10a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
10a30 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
10a40 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
10a50 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
10a60 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
10a70 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
10a80 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
10a90 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
10aa0 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
10ab0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10ac0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
10ad0 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   10)==(-1) ){.  
10ae0 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
10af0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
10b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10b10 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10b20 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10b30 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20  IOERR_RDLOCK);. 
10b40 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
10b50 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10b60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
10b70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10b80 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
10b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
10ba0 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
10bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10bc0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
10bd0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
10be0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
10bf0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
10c00 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10c10 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
10c20 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
10c30 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10c40 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
10c50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10c60 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10c70 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d  , &lock, 10)==(-
10c80 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
10c90 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10ca0 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
10cb0 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
10cc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
10cd0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10ce0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10d00 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
10d10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10d20 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10d30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
10d40 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10d50 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10d60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10d70 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10d80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10d90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10da0 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10db0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
10dc0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
10dd0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
10de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
10df0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
10e00 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
10e10 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
10e20 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
10e30 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10e40 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
10e50 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10e60 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
10e70 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10e80 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
10e90 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
10ea0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
10eb0 63 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  ck, 10) ){.     
10ec0 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10ed0 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
10ee0 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
10ef0 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63  ERR.          rc
10f00 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10f10 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10f20 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10f30 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_RDLOCK);.#else
10f40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
10f50 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
10f60 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
10f70 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
10f80 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
10f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
10fa0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
10fb0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
10fc0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
10fd0 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
10fe0 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
10ff0 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
11000 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
11010 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
11020 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
11030 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
11040 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
11050 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
11060 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
11070 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
11080 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
11090 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
110a0 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
110b0 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
110c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
110d0 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
110e0 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
110f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11100 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
11110 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11120 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 23 65  rno = tErrno;.#e
11130 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69  ndif.          i
11140 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11150 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
11160 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11170 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
11180 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11190 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
111a0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
111b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
111c0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
111d0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
111e0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
111f0 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
11200 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
11210 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
11220 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
11230 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
11240 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
11250 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
11260 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11270 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30  e, &lock, 10)==0
11280 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
11290 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
112a0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
112b0 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  else{.#if OSLOCK
112c0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
112d0 4f 45 52 52 0a 20 20 20 20 20 20 74 45 72 72 6e  OERR.      tErrn
112e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
112f0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11300 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11310 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11320 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
11330 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11340 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
11350 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11360 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11370 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
11380 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11390 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
113a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
113b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65  rrno = errno;.#e
113c0 6e 64 69 66 0a 20 20 20 20 20 20 67 6f 74 6f 20  ndif.      goto 
113d0 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
113e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c  }.  }.  if( eFil
113f0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
11400 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  {.    /* Decreme
11410 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
11420 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
11430 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
11440 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
11450 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
11460 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
11470 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
11480 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
11490 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
114a0 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
114b0 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
114c0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
114d0 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
114e0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
114f0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
11500 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
11510 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
11520 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
11530 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
11540 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11550 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11560 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  ck, 10)==0 ){.  
11570 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
11580 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11590 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
115a0 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
115b0 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
115c0 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
115d0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
115e0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
115f0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11600 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11610 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11620 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11630 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
11640 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11650 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
11670 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  e.        rc = S
11680 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11690 43 4b 3b 0a 09 20 20 20 20 70 46 69 6c 65 2d 3e  CK;..    pFile->
116a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
116b0 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  o;.#endif.      
116c0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
116d0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
116e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
116f0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11700 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
11710 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
11720 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
11730 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
11740 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
11750 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
11760 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
11770 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
11780 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
11790 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
117a0 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
117b0 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
117c0 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
117d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
117e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
117f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
11800 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
11810 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
11820 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
11830 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
11840 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
11850 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
11860 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
11870 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
11880 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
11890 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
118a0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
118b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
118c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
118d0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
118e0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
118f0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
11900 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
11910 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11920 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11930 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11940 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11950 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11960 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11970 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11980 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11990 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
119a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
119b0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
119c0 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
119d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
119e0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
119f0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
11a00 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
11a10 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k, 0);.}../*.** 
11a20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
11a30 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
11a40 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
11a50 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
11a60 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
11a70 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
11a80 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
11a90 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
11aa0 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
11ab0 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
11ac0 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
11ad0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
11ae0 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
11af0 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
11b00 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
11b10 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
11b20 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
11b30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11b40 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
11b50 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
11b60 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
11b70 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
11b80 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
11b90 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
11ba0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
11bb0 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
11bc0 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
11bd0 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
11be0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11bf0 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 4f 53 43  ile*)id;.#if OSC
11c00 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45  LOSE_CHECK_CLOSE
11c10 5f 49 4f 45 52 52 0a 20 20 69 66 28 20 70 46 69  _IOERR.  if( pFi
11c20 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
11c30 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
11c40 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69  pFile->h);.    i
11c50 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
11c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11c70 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
11c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11c90 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d  ERR_CLOSE;.    }
11ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11cb0 65 2d 3e 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20  e->h=-1;.    }. 
11cc0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
11cd0 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
11ce0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
11cf0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
11d00 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
11d10 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
11d20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  }.#endif.#if OS_
11d30 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
11d40 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
11d50 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
11d60 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
11d70 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
11d80 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
11d90 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
11da0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
11db0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
11dc0 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
11dd0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
11de0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
11df0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
11e00 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
11e10 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
11e20 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
11e30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
11e40 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
11e50 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
11e60 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
11e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11e80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11e90 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
11ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
11eb0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
11ec0 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
11ed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11ee0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11ef0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
11f00 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  d;.  unixUnlock(
11f10 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
11f20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
11f30 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
11f40 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
11f50 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
11f60 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
11f70 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
11f80 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
11f90 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
11fa0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
11fb0 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
11fc0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
11fd0 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
11fe0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
11ff0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
12000 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
12010 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
12020 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
12030 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
12040 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
12050 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
12060 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
12070 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
12080 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
12090 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
120a0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
120b0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
120c0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
120d0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
120e0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
120f0 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
12100 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
12110 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
12120 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
12130 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
12140 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
12150 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
12160 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
12170 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
12180 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
12190 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
121a0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
121b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
121c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
121d0 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
121e0 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
121f0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
12210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
12260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
122d0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
12300 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
12310 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
12320 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
12330 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
12340 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
12350 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
12360 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
12370 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
12380 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
12390 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
123a0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
123b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
123c0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
123d0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
123e0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
123f0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
12400 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
12410 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
12420 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
12430 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
12440 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
12450 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
12460 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
12470 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
12480 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
12490 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
124a0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
124b0 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
124c0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
124d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
124e0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
124f0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
12500 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
12510 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
12520 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
12530 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
12540 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
12550 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
12560 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
12570 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
12580 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
12590 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
125a0 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
125b0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
125c0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
125d0 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
125e0 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
125f0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12600 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
12610 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12620 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12630 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
12640 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
12650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12660 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
12670 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12680 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12690 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
126a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
126b0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
126c0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
126d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
126e0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
126f0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12700 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
12710 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
12720 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
12730 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
12740 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12750 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12760 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
12770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
12780 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
12790 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
127a0 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
127b0 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
127e0 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
127f0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
128d0 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12900 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
12910 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
12920 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
12930 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70  existance of sep
12940 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
12950 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
12960 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
12970 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
12980 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
12990 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
129a0 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
129b0 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
129c0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
129d0 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
129e0 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
129f0 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
12a00 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
12a10 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
12a20 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
12a30 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
12a40 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
12a50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
12a60 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
12a70 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
12a80 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
12a90 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
12aa0 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
12ab0 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
12ac0 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
12ad0 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
12ae0 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
12af0 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
12b00 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
12b10 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
12b20 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
12b30 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
12b40 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
12b50 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
12b60 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
12b70 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
12b80 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
12b90 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
12ba0 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
12bb0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
12bc0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
12bd0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
12be0 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
12bf0 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
12c00 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
12c10 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stance of a lock
12c20 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
12c30 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
12c40 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
12c50 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
12c60 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
12c70 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
12c80 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
12c90 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
12ca0 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
12cb0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
12cc0 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
12cd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
12ce0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
12cf0 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
12d00 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
12d10 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
12d20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12d30 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
12d40 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
12d50 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
12d60 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
12d70 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
12d80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
12d90 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
12da0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
12db0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
12dc0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
12dd0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
12de0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
12df0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
12e00 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
12e10 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
12e20 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
12e30 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
12e40 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
12e50 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
12e60 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
12e70 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
12e80 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
12e90 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
12ea0 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
12eb0 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
12ec0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
12ed0 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
12ee0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
12ef0 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
12f00 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
12f10 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
12f20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
12f30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12f40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12f50 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12f60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12f70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12f80 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12f90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12fa0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12fb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12fd0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12fe0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12ff0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13000 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
13010 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
13020 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
13030 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
13040 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
13050 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
13060 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
13070 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
13080 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
13090 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
130a0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
130b0 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
130c0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
130d0 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
130e0 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
130f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
13110 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
13120 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
13130 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
13140 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
13150 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
13160 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
13170 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
13180 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
13190 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
131a0 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
131b0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
131c0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
131d0 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
131e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
131f0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
13200 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
13210 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
13220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13230 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13240 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
13250 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
13260 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
13270 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13280 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
13290 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
132a0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
132b0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
132c0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
132d0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
132e0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
132f0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
13300 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
13310 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
13320 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
13330 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
13340 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
13350 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
13360 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
13370 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
13380 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
13390 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
133a0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
133b0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
133c0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
133d0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
133e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
133f0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
13400 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
13410 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
13420 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
13430 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
13440 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
13450 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
13460 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
13470 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
13480 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13490 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
134a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
134b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
134c0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
134d0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
134e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
134f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
13500 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13510 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13520 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
13530 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
13540 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
13550 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
13560 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
13570 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
13580 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
13590 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
135a0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
135b0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
135c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
135d0 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
135e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
135f0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13600 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13610 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13620 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
13630 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
13640 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
13650 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
13660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
13670 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
13680 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
13690 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
136a0 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
136b0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
136c0 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
136d0 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
136e0 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
136f0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
13700 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13710 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
13720 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13730 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13740 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
13750 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
13760 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
13770 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
13780 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
13790 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
137a0 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
137b0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
137c0 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
137d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137e0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
137f0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
13800 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
13810 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
13820 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
13830 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
13840 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
13850 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
13860 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
13870 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13880 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
13890 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
138a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
138b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
138c0 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
138d0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
138e0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
138f0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13900 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
13910 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
13930 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13940 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
13950 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13960 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
13970 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
13980 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
13990 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
139a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
139b0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
139c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
139d0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
139e0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
139f0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13a00 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13a10 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13a20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13a30 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
13a50 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
13a60 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
13a70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
13a80 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
13a90 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
13aa0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
13ab0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13ac0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
13ad0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13ae0 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
13af0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
13b00 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
13b10 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
13b20 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13b30 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13b40 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
13b50 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13b60 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
13b70 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
13b80 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
13b90 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
13ba0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
13bb0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13bc0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13bd0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13be0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
13bf0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
13c00 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
13c10 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
13c20 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
13c30 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
13c40 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
13c50 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
13c60 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
13c70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
13c80 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
13c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13ca0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
13cb0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
13cc0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
13cd0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
13ce0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
13cf0 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
13d00 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
13d10 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
13d20 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
13d30 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
13d40 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13d50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13d60 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
13d70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13d90 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
13da0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
13db0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
13dc0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
13dd0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
13de0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
13df0 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
13e00 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
13e10 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
13e20 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
13e30 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
13e40 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
13e50 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13e60 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
13e70 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
13e80 20 74 45 72 72 6e 6f 20 29 7b 0a 23 69 66 20 4f   tErrno ){.#if O
13e90 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
13ea0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
13eb0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13ec0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13ed0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13ee0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
13ef0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
13f00 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13f10 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  K;.#endif.    }.
13f20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13f30 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13f40 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13f50 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13f60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13f70 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
13f80 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
13f90 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
13fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13fb0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13fc0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
13fd0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
13fe0 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
13ff0 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
14000 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
14010 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14020 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  id) {.  int rc;.
14030 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
14040 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14050 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14060 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
14070 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
14080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14090 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
140a0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
140b0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
140c0 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  le(id);.  return
140d0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
140f0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
14100 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14110 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
14120 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
141d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141e0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
141f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
14200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14210 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
14220 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
14230 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
14240 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
14250 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
14260 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
14270 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
14280 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
14290 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
142a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
142b0 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
142c0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
142d0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
142e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
142f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
14300 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
14310 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
14320 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
14330 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
14340 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
14350 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
14360 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
14370 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
14380 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
14390 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
143a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
143b0 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
143c0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
143d0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
143e0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
143f0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
14400 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
14410 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
14420 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
14430 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
14440 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
14450 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
14460 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
14470 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
14480 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
14490 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
144a0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
144b0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
144c0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
144d0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
144e0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
144f0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
14500 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
14510 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
14520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
14530 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
14540 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
14550 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
14560 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
14570 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
14580 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
14590 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
145a0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
145b0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
145c0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
145d0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
145e0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
145f0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
14600 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
14610 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
14620 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14630 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14640 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14650 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
14660 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
14670 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14680 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
14690 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
146a0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
146b0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
146c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
146d0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
146e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
146f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
14700 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
14710 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14720 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
14730 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
14740 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14750 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
14760 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
14770 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
14780 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
14790 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
147a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
147b0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
147c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
147d0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
147e0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
147f0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
14800 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
14810 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
14820 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
14830 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
14840 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
14850 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
14860 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
14870 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
14880 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
14890 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
148a0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
148b0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
148c0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
148d0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
148e0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
148f0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
14900 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
14910 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
14920 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14930 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
14940 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
14950 72 72 6f 72 20 2a 2f 0a 23 69 66 20 4f 53 4c 4f  rror */.#if OSLO
14960 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
14970 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 6c  _IOERR.        l
14980 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
14990 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
149a0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
149b0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
149c0 73 65 20 0a 20 20 20 20 20 20 20 20 6c 72 63 20  se .        lrc 
149d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
149e0 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20  NLOCK; .#endif. 
149f0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
14a00 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
14a10 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
14a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
14a30 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
14a40 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
14a50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14a60 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
14a70 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
14a80 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
14a90 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
14aa0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
14ab0 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
14ac0 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
14ad0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14ae0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14af0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
14b00 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
14b10 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14b20 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
14b30 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14b40 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
14b50 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
14b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14b70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
14b80 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
14b90 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
14ba0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14bb0 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
14bc0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
14bd0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
14be0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
14bf0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
14c00 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
14c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14c20 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
14c30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
14c40 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14c50 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
14c60 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
14c70 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14c90 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14ca0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14cb0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14cc0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14cd0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14ce0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14cf0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14d00 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
14d10 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
14d20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
14d30 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
14d40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
14d50 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
14d60 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14d70 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14d80 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14d90 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14da0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14db0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14dc0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14dd0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14de0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14df0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14e00 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
14e10 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
14e20 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
14e30 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
14e40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
14e50 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
14e60 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14e70 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14e80 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14e90 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14ea0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14eb0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14ec0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14ed0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14ee0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14ef0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14f00 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
14f10 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14f20 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
14f30 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
14f40 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
14f50 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
14f60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
14f70 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
14f80 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
14f90 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
14fa0 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
14fb0 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
14fc0 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
14fd0 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
14fe0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
14ff0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
15000 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
15010 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
15020 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
15030 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
15040 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
15050 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
15060 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
15070 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
15080 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
15090 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
150a0 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
150b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
150c0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
150d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
150e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
150f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15100 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
15110 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15120 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
15130 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
15140 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
15150 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
15160 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
15170 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
15180 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
15190 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
151a0 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
151b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
151c0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
151d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
151e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
151f0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
15200 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
15210 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
15220 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
15230 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
15240 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
15250 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
15260 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
15270 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
15280 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
15290 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
152a0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
152b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
152c0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
152d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
152e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
152f0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
15300 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
15310 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
15320 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
15330 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
15340 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15350 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
15360 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
15370 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
15380 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
15390 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
153a0 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
153b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
153c0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
153d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
153e0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
153f0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
15400 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
15410 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
15420 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
15430 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
15440 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15450 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
15460 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
15470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
15480 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
15490 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
154a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
154b0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
154c0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
154d0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
154e0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
154f0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
15500 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
15510 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
15520 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
15530 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
15540 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
15550 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
15560 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15570 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
15580 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
15590 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
155a0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
155b0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
155c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
155d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
155e0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
155f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
15600 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
15610 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
15620 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
15630 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
15640 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15650 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
15660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
15670 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
15680 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
15690 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
156a0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
156b0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
156c0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
156d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
156e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
156f0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
15700 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
15710 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
15720 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
15730 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
15740 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
15750 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15760 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
15770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15780 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
15790 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
157a0 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
157b0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
157c0 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
157d0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
157e0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
157f0 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
15800 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
15810 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
15820 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
15830 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
15840 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
15850 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
15860 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15870 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
15880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15890 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
158a0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
158b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
158c0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
158d0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
158e0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
158f0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
15900 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65  _LOCK);.  }.  re
15910 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
15920 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
15930 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
15940 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
15950 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
15960 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15970 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
15980 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
15990 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15a70 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
15a80 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
15a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15aa0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
15ab0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
15ac0 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
15ad0 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
15ae0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
15af0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
15b00 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
15b10 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
15b20 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
15b30 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
15b40 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
15b50 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
15b60 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
15b70 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
15b80 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
15b90 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
15ba0 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
15bb0 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
15bc0 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
15bd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
15be0 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
15bf0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
15c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15c10 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15c20 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15c30 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
15c40 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
15c50 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
15c60 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15c70 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15c80 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15c90 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15ca0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15cb0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15cc0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15cd0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15ce0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15cf0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15d00 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15d10 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15d20 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15d30 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
15d40 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15d50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15d60 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
15d70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15d80 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
15d90 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
15da0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15db0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
15dc0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15dd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15de0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15df0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15e00 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
15e10 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
15e20 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
15e30 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
15e40 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
15e50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15e60 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
15e70 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15e80 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
15e90 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
15ea0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
15eb0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
15ec0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
15ed0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
15ee0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
15ef0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
15f00 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
15f10 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
15f20 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
15f30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
15f40 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
15f50 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
15f60 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
15f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15f80 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15f90 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15fa0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15fb0 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
15fc0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15fd0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
15fe0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
15ff0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
16000 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
16010 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
16020 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
16030 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
16040 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
16050 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
16060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16070 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
16080 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
16090 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
160a0 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
160b0 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
160c0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
160d0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
160e0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
160f0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16100 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
16110 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
16120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16130 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16140 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16150 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16160 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
16170 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
16180 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
16190 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
161a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
161b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
161c0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
161d0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
161e0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
161f0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16200 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16210 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16220 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16230 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16240 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16250 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
16260 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
16270 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
16280 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
16290 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
162a0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
162b0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
162c0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
162d0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
162e0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
162f0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16300 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16310 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16320 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16330 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16340 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16350 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
16360 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
16370 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
16380 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
16390 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
163a0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
163b0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
163c0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
163d0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
163e0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
163f0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
16400 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
16410 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
16420 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
16430 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
16440 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
16450 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
16460 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
16470 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
16480 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
16490 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
164a0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
164b0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
164c0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
164d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
164e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
164f0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16500 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16510 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16520 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
16530 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
16540 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
16550 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
16560 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16570 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
16580 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16590 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
165a0 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
165b0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
165c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
165d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
165e0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
165f0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
16600 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
16610 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
16620 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
16630 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
16640 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
16650 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
16660 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
16670 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16680 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16690 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
166a0 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
166b0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
166c0 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
166d0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
166e0 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
166f0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
16700 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
16710 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
16720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16730 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
16740 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
16750 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
16760 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
16770 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
16780 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16790 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
167a0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
167b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
167c0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
167d0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
167e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
167f0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
16800 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
16810 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
16820 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
16830 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
16840 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16850 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
16860 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
16870 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
16880 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
16890 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
168a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
168b0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
168c0 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
168d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
168e0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
168f0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
16900 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16910 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
16920 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
16930 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
16940 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16950 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
16960 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16970 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16980 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
16990 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
169a0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
169b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
169c0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
169d0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
169e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
169f0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
16a00 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
16a10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16a20 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
16a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
16a50 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
16a60 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
16a70 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
16a80 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
16a90 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
16aa0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
16ab0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16ac0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16ae0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
16af0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
16b00 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
16b10 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
16b20 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
16b30 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
16b40 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
16b50 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
16b60 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
16b70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
16b80 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
16b90 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
16ba0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
16bb0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
16bc0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
16bd0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
16be0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16bf0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
16c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16c10 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
16c20 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
16c30 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
16c40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
16c50 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
16c60 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
16c70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16c80 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
16c90 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
16ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16cb0 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
16cc0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
16cd0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
16ce0 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
16cf0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
16d00 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
16d10 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
16d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16d30 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
16d40 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
16d50 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
16d60 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
16d70 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
16d80 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
16d90 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
16da0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
16db0 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
16dc0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
16dd0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
16ea0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
16eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ec0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
16ed0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
16ee0 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
16ef0 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
16f00 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
16f10 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
16f20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
16f30 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
16f40 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
16f50 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
16f60 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
16f70 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
16f80 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
16f90 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
16fa0 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
16fb0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
16fc0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
16fd0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
16fe0 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
16ff0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17000 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
17010 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
17020 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
17030 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
17040 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17050 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
17060 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
17070 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
17080 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
17090 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
170a0 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
170b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
170c0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
170d0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
170e0 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
170f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
17100 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
17110 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
17120 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
17130 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
17140 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
17150 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
17160 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
17170 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
17180 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
17190 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
171a0 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
171b0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
171c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
171d0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
171e0 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
171f0 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
17200 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17210 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
17220 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
17230 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
17240 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
17250 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
17280 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
17290 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
172a0 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
172b0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
172c0 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
172d0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
172e0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
172f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
17300 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
17310 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
17320 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
17330 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
17340 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
17350 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
17360 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
17370 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
17380 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
17390 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
173a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
173b0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
173c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
173d0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
173e0 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
173f0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
17400 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
17410 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
17420 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
17430 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
17440 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
17450 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
17460 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
17470 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
17480 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
17490 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
174a0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
174b0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
174c0 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
174d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
174e0 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
174f0 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
17500 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
17510 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
17520 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
17530 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
17540 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
17550 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
17560 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
17570 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
17580 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
17590 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
175a0 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
175b0 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
175c0 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
175d0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
175e0 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
175f0 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
17600 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
17610 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
17620 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
17630 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
17640 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
17650 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
17660 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
17670 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
17680 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
17690 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
176a0 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
176b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
176c0 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
176d0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
176e0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
176f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17700 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
17710 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
17720 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
17730 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
17740 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
17750 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
17760 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
17770 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
17780 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
177b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
177c0 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
177d0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
177e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
177f0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
17800 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
17810 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
17820 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
17830 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
17840 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
17850 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
17860 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
17870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
17880 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
17890 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
178a0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
178b0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
178c0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
178d0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
178e0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
178f0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
17900 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
17910 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
17920 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
17930 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
17940 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
17950 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
17960 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
17970 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
17980 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
17990 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
179a0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
179b0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
179c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
179d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
179e0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
179f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17a00 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
17a10 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
17a20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17a30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
17a40 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17a50 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20   *context;.  .  
17a60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17a80 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
17a90 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
17aa0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
17ab0 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  .  context = (af
17ac0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17ad0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
17ae0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
17af0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
17b00 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
17b10 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
17b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17b30 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
17b40 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
17b50 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
17b60 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
17b70 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
17b80 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
17b90 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
17ba0 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
17bb0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
17bc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
17bd0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
17be0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
17bf0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
17c00 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
17c10 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
17c20 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
17c30 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
17c40 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
17c50 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
17c60 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
17c70 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
17c80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17c90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
17ca0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
17cb0 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
17cc0 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
17cd0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
17ce0 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
17cf0 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
17d00 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
17d10 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
17d20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
17d30 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
17d40 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
17d50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17d60 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
17d70 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17d80 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17d90 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
17da0 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
17db0 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
17dc0 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
17dd0 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
17de0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
17df0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
17e00 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
17e10 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
17e20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
17e30 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
17e40 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
17e50 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
17e60 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17e70 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
17e80 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
17e90 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
17ea0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17eb0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
17ec0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
17ed0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
17ee0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
17ef0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
17f00 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
17f10 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
17f20 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
17f30 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
17f40 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
17f50 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
17f60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
17f70 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
17f80 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
17f90 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
17fa0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
17fb0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
17fc0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
17fd0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
17fe0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
17ff0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
18000 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
18010 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
18020 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
18030 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
18040 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
18050 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
18060 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18070 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
18080 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
18090 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
180a0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
180b0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
180c0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
180d0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
180e0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
180f0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
18100 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
18110 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
18120 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
18130 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
18140 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
18150 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
18160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18170 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
18180 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
18190 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
181a0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
181b0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
181c0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
181d0 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
181e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
181f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18200 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
18220 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
18230 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
18240 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
18250 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
18260 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
18270 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
18280 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
18290 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
182a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
182b0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
182c0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
182d0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
182e0 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
182f0 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
18300 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
18310 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
18320 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
18330 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
18340 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
18350 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
18360 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
18370 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
18380 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
18390 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
183a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
183b0 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
183c0 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
183d0 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
183e0 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
183f0 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
18400 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
18410 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
18420 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
18430 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
18440 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
18450 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
18460 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
18470 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
18480 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
18490 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
184a0 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
184b0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
184c0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
184d0 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
184e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
184f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
18500 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
18510 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
18520 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
18530 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
18540 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
18550 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
18560 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
18570 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
18580 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
18590 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
185a0 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
185b0 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
185c0 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
185d0 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
185e0 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
185f0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
18600 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
18610 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
18620 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
18630 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
18640 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
18650 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
18660 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
18670 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
18680 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
18690 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
186a0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
186b0 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
186c0 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
186d0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
186e0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
186f0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
18700 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
18710 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
18720 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
18730 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
18740 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
18750 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
18760 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
18770 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
18780 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
18790 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
187a0 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
187b0 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
187c0 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
187d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
187e0 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
187f0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
18800 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
18810 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
18820 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
18830 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18840 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
18850 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
18860 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
18870 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
18880 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
18890 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
188a0 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
188b0 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
188c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
188d0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
188e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
188f0 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
18900 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
18910 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18920 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
18930 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18940 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18950 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
18960 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
18970 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
18980 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
18990 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
189a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
189b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
189c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
189d0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
189e0 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
189f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18a00 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
18a10 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
18a20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
18a30 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
18a40 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
18a50 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
18a60 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
18a70 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
18a80 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
18a90 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
18aa0 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
18ab0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18ac0 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
18ad0 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
18ae0 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
18af0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
18b00 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18b10 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
18b20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
18b30 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18b40 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18b50 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
18b60 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
18b70 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
18b80 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
18b90 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18ba0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18bb0 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
18bc0 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
18bd0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
18be0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18bf0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
18c00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
18c10 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
18c20 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18c30 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
18c40 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
18c50 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18c60 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
18c70 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
18c80 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
18c90 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
18ca0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
18cb0 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
18cc0 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
18cd0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
18ce0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18cf0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
18d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
18d10 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18d20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
18d30 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
18d40 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
18d50 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
18d60 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
18d70 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
18d80 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
18d90 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
18da0 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
18db0 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
18dc0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
18dd0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
18de0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
18df0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
18e00 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
18e10 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
18e20 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
18e30 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
18e40 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18e50 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
18e60 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
18e70 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
18e80 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
18e90 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18ea0 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
18eb0 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
18ec0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
18ed0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
18ee0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
18ef0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
18f00 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
18f10 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18f20 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18f30 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18f40 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
18f50 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
18f60 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
18f70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
18f80 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
18f90 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
18fa0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
18fb0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
18fc0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18fd0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
18fe0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
18ff0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
19000 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
19010 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
19020 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
19030 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
19040 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
19050 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19060 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
19070 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
19080 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
19090 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
190a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
190b0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
190c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
190d0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
190e0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
190f0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
19100 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
19110 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
19120 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
19130 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
19140 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
19150 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
19160 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
19170 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
19180 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
19190 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
191a0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
191b0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
191c0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
191d0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
191e0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
191f0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
19200 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
19210 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
19220 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
19230 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
19240 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
19250 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
19260 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
19270 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
19280 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
19290 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
192a0 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
192b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
192c0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
192d0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
192e0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
192f0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
19300 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
19310 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
19320 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
19330 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
19340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19350 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
19360 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
19370 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
19380 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
19390 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
193a0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
193b0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
193c0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
193d0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
193e0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
193f0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
19400 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
19410 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
19420 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
19430 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
19440 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
19450 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
19460 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19470 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
19480 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
194b0 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
194c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
194d0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
194e0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
194f0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
19500 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
19510 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
19520 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
19530 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19540 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19550 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
19560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
19590 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
195a0 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
195b0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
195c0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
195d0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
195f0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
19600 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
19610 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
19620 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
19630 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
19640 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
19650 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
19660 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
19670 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
19680 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
19690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
196a0 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
196b0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
196c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
196d0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
196e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
196f0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
19700 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
19710 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
19720 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
19730 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
19740 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
19750 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
19760 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
19770 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
19780 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
19790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
197a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
197b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
197c0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
197d0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
197e0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
197f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
19800 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
19810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19820 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
19830 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
19840 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
19850 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
19860 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
19870 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
19880 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
19890 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
198a0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
198b0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
198c0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
198d0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
198e0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
198f0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
19900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
19910 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
19920 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
19930 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
19940 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
19950 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
19960 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
19970 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
19980 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
19990 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
199a0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
199b0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
199c0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
199d0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
199e0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
199f0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19a10 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
19a20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
19a30 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
19a40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19a50 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
19a60 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19a70 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
19a80 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
19a90 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
19aa0 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
19ab0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
19ac0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
19ad0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
19ae0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
19af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19b00 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
19b10 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
19b20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
19b30 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
19b40 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
19b50 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
19b60 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
19b70 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
19b80 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19b90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
19ba0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
19bb0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
19bc0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
19bd0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
19be0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
19bf0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
19c00 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
19c10 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
19c20 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
19c30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19c40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
19c50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
19c60 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
19c70 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
19c80 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
19c90 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
19ca0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
19cb0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
19cc0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
19cd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
19ce0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
19cf0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19d00 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
19d10 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19d20 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
19d30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19d40 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
19d50 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19d60 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
19d70 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
19d80 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
19d90 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
19da0 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
19db0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19dc0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
19dd0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
19de0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
19df0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
19e00 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
19e10 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
19e20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
19e30 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
19e40 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
19e50 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
19e60 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
19e70 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
19e80 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
19e90 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
19ea0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
19eb0 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
19ec0 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
19ed0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
19ee0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
19ef0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
19f00 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
19f10 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
19f20 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
19f30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
19f40 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
19f50 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
19f60 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
19f70 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
19f80 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
19f90 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
19fa0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
19fb0 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
19fc0 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
19fd0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
19fe0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
19ff0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
1a000 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a010 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a020 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
1a030 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
1a040 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1a050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a060 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
1a070 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
1a080 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
1a090 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
1a0a0 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
1a0b0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
1a0c0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1a0d0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
1a0e0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
1a0f0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
1a100 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
1a110 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1a120 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a130 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
1a140 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
1a150 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
1a160 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
1a170 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
1a180 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a1a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a1b0 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
1a1c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1a1d0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a1e0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a1f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
1a200 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
1a210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a220 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
1a230 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
1a240 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
1a250 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
1a260 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1a270 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a280 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
1a290 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
1a2a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
1a2b0 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
1a2c0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
1a2d0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
1a2e0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1a2f0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
1a300 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1a310 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
1a320 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
1a330 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1a340 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
1a350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1a360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a370 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
1a380 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
1a390 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
1a3a0 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
1a3b0 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
1a3c0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
1a3d0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
1a3e0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
1a3f0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
1a400 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
1a410 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
1a420 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
1a430 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
1a440 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
1a450 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
1a460 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
1a470 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
1a480 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
1a490 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
1a4a0 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
1a4b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a4c0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a4d0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a4e0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
1a4f0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a500 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1a510 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
1a520 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
1a530 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a540 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a550 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
1a560 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
1a570 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1a580 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
1a590 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
1a5a0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
1a5b0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
1a5c0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
1a5d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a5e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a5f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
1a600 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
1a610 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
1a620 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
1a630 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
1a640 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
1a650 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
1a660 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
1a670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1a680 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
1a690 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
1a6a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
1a6b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
1a6c0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
1a6d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a6e0 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
1a6f0 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
1a700 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
1a710 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ext .*/.static i
1a720 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69  nt afpClose(sqli
1a730 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
1a740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a750 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
1a760 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
1a770 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1a780 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
1a790 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
1a7a0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
1a7b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
1a7c0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
1a7d0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
1a7e0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
1a7f0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1a800 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
1a810 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
1a820 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
1a830 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
1a840 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
1a850 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
1a860 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
1a870 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
1a880 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
1a890 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
1a8a0 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
1a8b0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
1a8c0 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
1a8d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
1a8e0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
1a8f0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1a900 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
1a910 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
1a920 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
1a930 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71  o(pFile);.    sq
1a940 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
1a950 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1a960 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
1a970 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
1a980 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
1a990 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
1a9a0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
1a9b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1a9c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1a9d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1a9e0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1a9f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1aa00 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1aa10 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1aa20 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1aa30 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1aa40 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1aa50 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1aa60 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1aa70 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1aa80 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
1aa90 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
1aaa0 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
1aab0 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
1aac0 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
1aad0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
1aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaf0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
1ab00 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1ab10 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
1abf0 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
1ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
1ac20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1ac30 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1ac40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ac50 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
1ac60 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1ac70 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1ac80 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
1ac90 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
1aca0 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
1acb0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1acc0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1acd0 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
1ace0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1acf0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1ad00 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1ad10 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
1ad20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1ad30 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1ad40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1ad50 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
1ad60 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
1ad70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1ad80 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
1ad90 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
1ada0 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
1adb0 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
1adc0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1add0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1ade0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1adf0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1ae00 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1ae10 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
1ae20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1ae30 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1ae40 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1ae50 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1ae60 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1ae70 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1ae80 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1ae90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1aea0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1aec0 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1aed0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aef0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1af00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af40 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1af50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1afa0 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
1afb0 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
1afc0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afe0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
1aff0 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
1b000 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
1b010 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
1b020 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
1b030 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
1b040 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
1b050 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
1b060 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
1b070 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
1b080 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
1b090 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
1b0a0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1b0b0 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
1b0c0 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
1b0d0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
1b0e0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
1b0f0 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
1b100 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
1b110 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
1b120 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
1b130 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
1b140 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1b150 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1b160 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
1b170 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1b180 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b190 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1b1a0 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
1b1b0 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
1b1c0 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
1b1d0 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
1b1e0 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
1b1f0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1b200 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1b210 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
1b220 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
1b230 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
1b240 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
1b250 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
1b260 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
1b270 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61  E_PREAD.** any a
1b280 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
1b290 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
1b2a0 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
1b2b0 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
1b2c0 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
1b2d0 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
1b2e0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1b2f0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1b300 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1b310 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
1b320 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1b330 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1b340 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1b350 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
1b360 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
1b370 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1b380 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
1b390 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1b3a0 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70  int got;.  int p
1b3b0 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21  rior = 0;.#if (!
1b3c0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1b3d0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
1b3e0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
1b3f0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
1b400 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
1b410 52 54 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65  RT;.  do{.#if de
1b420 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1b430 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
1b440 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1b450 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1b460 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b470 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1b480 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
1b490 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f  _PREAD64).    go
1b4a0 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
1b4b0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
1b4c0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
1b4d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
1b4e0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
1b4f0 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20      newOffset = 
1b500 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
1b510 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
1b520 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1b530 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
1b540 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
1b550 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
1b560 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66  .      if( newOf
1b570 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
1b580 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1b590 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1b5a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1b5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28  }else{.        (
1b5c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1b5d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
1b5e0 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ..      }.      
1b5f0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1b600 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
1b610 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
1b620 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
1b630 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
1b640 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
1b650 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
1b660 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
1b670 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
1b680 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
1b690 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
1b6a0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1b6b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b6c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b6d0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
1b6e0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
1b6f0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
1b700 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
1b710 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
1b720 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
1b730 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
1b740 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
1b750 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
1b760 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
1b770 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
1b780 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
1b790 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
1b7a0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
1b7b0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
1b7c0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
1b7d0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
1b7e0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
1b7f0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1b800 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
1b810 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
1b820 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
1b830 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
1b840 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
1b850 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
1b860 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
1b870 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
1b880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1b890 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
1b8a0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
1b8b0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1b8c0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1b8d0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
1b8e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1b8f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1b900 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
1b910 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
1b920 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b930 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1b940 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1b950 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1b960 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1b970 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1b980 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1b990 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1b9a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1b9b0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1b9c0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1b9d0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1b9e0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1b9f0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1ba00 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1ba10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1ba20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
1ba30 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
1ba40 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1ba50 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
1ba60 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
1ba70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ba80 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
1ba90 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
1baa0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1bab0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
1bac0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bad0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
1bae0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1baf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
1bb00 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1bb10 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1bb20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1bb30 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1bb40 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1bb50 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1bb60 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1bb70 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1bb80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bb90 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1bba0 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1bbb0 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1bbc0 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
1bbd0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
1bbe0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
1bbf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1bc00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
1bc10 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
1bc20 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
1bc30 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1bc40 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1bc50 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1bc60 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
1bc70 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
1bc80 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
1bc90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1bca0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
1bcb0 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
1bcc0 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
1bcd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1bce0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
1bcf0 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
1bd00 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
1bd10 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
1bd20 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
1bd30 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
1bd40 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
1bd50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1bd60 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f  _PREAD).  do{ go
1bd70 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d  t = osPwrite(id-
1bd80 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1bd90 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
1bda0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
1bdb0 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1bdc0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1bdd0 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20  64).  do{ got = 
1bde0 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68  osPwrite64(id->h
1bdf0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
1be00 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74  set);}while( got
1be10 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1be20 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b  TR);.#else.  do{
1be30 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
1be40 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
1be50 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
1be60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1be70 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
1be80 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
1be90 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
1bea0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
1beb0 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
1bec0 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
1bed0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1bee0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1bef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bf00 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1bf10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
1bf20 09 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ...      }.     
1bf30 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1bf40 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72  }.    got = osWr
1bf50 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
1bf60 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28   cnt);.  }while(
1bf70 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
1bf80 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66  =EINTR );.#endif
1bf90 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1bfa0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1bfb0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1bfc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1bfd0 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  rno;.  }..  OSTR
1bfe0 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1bff0 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1c000 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
1c010 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
1c020 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
1c030 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
1c040 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
1c050 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
1c060 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
1c070 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1c080 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
1c090 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1c0a0 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
1c0b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1c0c0 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
1c0d0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
1c0e0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1c0f0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
1c100 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1c110 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
1c120 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c130 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
1c140 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
1c150 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
1c160 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
1c170 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1c180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1c190 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
1c1a0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
1c1b0 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
1c1c0 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
1c1d0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1c1e0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
1c1f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1c200 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
1c210 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
1c220 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
1c230 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
1c240 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
1c250 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
1c260 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
1c270 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
1c280 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
1c290 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1c2a0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1c2b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1c2c0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1c2d0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
1c2e0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1c2f0 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
1c300 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
1c310 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
1c320 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1c330 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
1c340 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
1c350 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
1c360 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
1c370 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c380 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
1c390 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
1c3a0 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
1c3b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1c3c0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
1c3d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
1c3e0 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
1c3f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1c400 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
1c410 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
1c420 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
1c430 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
1c440 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
1c450 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
1c460 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c470 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c480 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
1c490 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
1c4a0 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
1c4b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c4c0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1c4d0 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
1c4e0 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
1c4f0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
1c500 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
1c510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1c520 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1c530 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
1c540 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1c550 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
1c560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c570 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
1c580 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
1c590 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1c5a0 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1c5b0 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
1c5c0 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1c5d0 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1c5e0 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1c5f0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1c600 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1c610 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c620 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1c630 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1c640 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1c650 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1c660 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1c670 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
1c680 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1c690 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1c6a0 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1c6b0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1c6c0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1c6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c6e0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1c6f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c700 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c710 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
1c720 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
1c730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c740 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1c750 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1c760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1c770 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1c780 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1c790 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
1c7a0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
1c7b0 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
1c7c0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
1c7d0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
1c7e0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
1c7f0 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
1c800 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
1c810 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1c820 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
1c830 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1c840 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
1c850 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
1c860 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
1c870 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
1c880 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
1c890 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
1c8a0 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
1c8b0 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
1c8c0 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
1c8d0 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72  (slightly slower
1c8e0 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66  ).** fsync(). If
1c8f0 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
1c900 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
1c910 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
1c920 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
1c930 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
1c940 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
1c950 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
1c960 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1c970 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65  (fdatasync).# de
1c980 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1c990 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1c9a0 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1c9b0 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1c9c0 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1c9d0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1c9e0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1c9f0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1ca00 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1ca10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1ca20 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1ca30 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1ca40 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1ca50 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1ca60 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1ca70 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1ca80 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1ca90 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1caa0 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  NC 0.#endif..#if
1cab0 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52  def SQLITE_USE_R
1cac0 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43  EQUEST_FULLFSYNC
1cad0 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69 66 79  .#import <notify
1cae0 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c 69 62  .h>.#import <lib
1caf0 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e  kern/OSAtomic.h>
1cb00 0a 73 74 61 74 69 63 20 4f 53 53 70 69 6e 4c 6f  .static OSSpinLo
1cb10 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d  ck notify_lock =
1cb20 20 30 3b 0a 23 64 65 66 69 6e 65 20 52 45 51 55   0;.#define REQU
1cb30 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54  EST_FULLSYNC_NOT
1cb40 49 46 49 43 41 54 49 4f 4e 20 20 20 20 22 63 6f  IFICATION    "co
1cb50 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e 63 22  m.apple.reqsync"
1cb60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1cb70 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1cb80 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1cb90 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1cba0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1cbb0 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1cbc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1cbd0 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1cbe0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1cbf0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1cc00 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1cc10 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1cc20 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1cc30 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1cc40 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1cc50 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1cc60 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1cc70 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1cc80 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1cc90 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1cca0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1ccb0 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1ccc0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1ccd0 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1cce0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1ccf0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1cd00 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1cd10 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1cd20 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1cd30 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1cd40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1cd50 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1cd60 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1cd70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1cd80 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1cd90 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1cda0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1cdb0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1cdc0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1cdd0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1cde0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1cdf0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1ce00 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1ce10 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1ce20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1ce30 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1ce40 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1ce50 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1ce60 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1ce70 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1ce80 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1ce90 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1cea0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1ceb0 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1cec0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1ced0 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1cee0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1cef0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1cf00 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1cf10 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1cf20 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1cf30 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1cf40 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1cf50 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1cf60 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1cf70 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1cf80 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1cf90 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1cfa0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1cfb0 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1cfc0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1cfd0 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1cfe0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1cff0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1d000 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1d010 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1d020 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1d030 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1d040 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1d050 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d060 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1d070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1d080 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1d090 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1d0a0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1d0b0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1d0c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1d0d0 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1d0e0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1d0f0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1d100 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1d110 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1d120 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1d130 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1d140 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1d150 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1d160 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1d170 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1d180 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d190 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1d1a0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1d1b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d1c0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1d1d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d1e0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1d1f0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d200 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1d210 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1d220 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1d230 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d240 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d250 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d260 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1d270 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1d280 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1d290 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1d2a0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1d2b0 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1d2c0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1d2d0 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1d2e0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1d2f0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1d300 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1d310 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1d320 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d330 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1d340 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1d350 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1d360 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1d370 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1d380 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1d390 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1d3a0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1d3b0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1d3c0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1d3d0 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1d3e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1d3f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d400 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1d410 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
1d420 53 79 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53  Sync ){.#ifdef S
1d430 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1d440 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20  T_FULLFSYNC.    
1d450 72 63 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29  rc = osFsync(fd)
1d460 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20 7b  ;.    if (!rc) {
1d470 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63  .      OSSpinLoc
1d480 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f  kLock(&notify_lo
1d490 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ck);.      rc = 
1d4a0 6e 6f 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55  notify_post(REQU
1d4b0 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54  EST_FULLSYNC_NOT
1d4c0 49 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20  IFICATION);.    
1d4d0 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f    OSSpinLockUnlo
1d4e0 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29  ck(&notify_lock)
1d4f0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
1d500 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
1d510 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
1d520 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  0);.#endif.  }el
1d530 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1d540 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1d550 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1d560 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1d570 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1d580 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1d590 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1d5a0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1d5b0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1d5c0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1d5d0 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1d5e0 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1d5f0 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1d600 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1d610 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1d620 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1d630 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1d640 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1d650 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1d660 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1d670 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1d680 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1d690 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1d6a0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1d6b0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1d6c0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1d6d0 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1d6e0 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1d6f0 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1d700 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1d710 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1d720 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1d730 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1d740 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1d750 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1d760 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1d770 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1d780 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1d790 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1d7a0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1d7b0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1d7c0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1d7d0 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1d7e0 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1d7f0 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1d800 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1d810 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1d820 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1d830 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1d840 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1d850 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1d860 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1d870 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1d880 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1d890 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1d8a0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1d8b0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1d8c0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1d8d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d8e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1d8f0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1d900 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1d910 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1d920 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1d930 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1d940 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1d950 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1d960 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1d970 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1d980 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1d990 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1d9a0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1d9b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1d9c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1d9d0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1d9e0 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1d9f0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1da00 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1da10 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1da20 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1da30 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1da40 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1da50 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1da60 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1da70 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1da80 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1da90 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1daa0 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1dab0 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1dac0 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1dad0 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1dae0 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1daf0 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1db00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1db10 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1db20 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1db30 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1db40 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1db50 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1db60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1db70 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1db80 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1db90 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1dba0 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1dbb0 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1dbc0 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1dbd0 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1dbe0 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1dbf0 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1dc00 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1dc10 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1dc20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1dc30 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1dc40 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1dc50 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1dc60 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1dc70 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1dc80 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1dc90 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1dca0 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1dcb0 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1dcc0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1dcd0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1dce0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1dcf0 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1dd00 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1dd10 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1dd20 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1dd30 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1dd40 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1dd50 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1dd60 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1dd70 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1dd80 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1dd90 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1dda0 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1ddb0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1ddc0 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1ddd0 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1dde0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1ddf0 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1de00 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1de10 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1de20 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1de30 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1de40 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1de50 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
1de60 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1de70 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1de80 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1de90 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ){.#ifdef FD_CLO
1dea0 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63 6e  EXEC.      osFcn
1deb0 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
1dec0 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
1ded0 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
1dee0 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
1def0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1df00 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1df10 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1df20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1df30 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72  Fd = fd;.  retur
1df40 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f  n (fd>=0?SQLITE_
1df50 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  OK:unixLogError(
1df60 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1df70 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44  BKPT, "open", zD
1df80 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  irname));.}../*.
1df90 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1dfa0 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1dfb0 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1dfc0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1dfd0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1dfe0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1dff0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1e000 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1e010 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1e020 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1e030 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1e040 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1e050 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1e060 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1e070 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1e080 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1e090 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1e0a0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1e0b0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1e0c0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1e0d0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1e0e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1e0f0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1e100 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1e110 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1e120 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1e130 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1e140 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1e150 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1e160 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1e170 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1e180 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1e190 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1e1a0 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1e1b0 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1e1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1e1d0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1e1e0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1e1f0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1e200 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1e210 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1e220 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1e230 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1e240 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1e250 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1e260 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1e270 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1e280 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1e290 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1e2a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1e2b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e2c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1e2d0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1e2e0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1e2f0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1e300 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1e310 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1e320 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1e330 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1e340 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1e350 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1e360 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1e370 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1e380 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1e390 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1e3a0 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1e3b0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1e3c0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1e3d0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1e3e0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1e3f0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1e400 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1e410 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1e420 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1e430 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1e440 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1e450 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1e460 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1e470 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1e480 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1e490 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1e4a0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1e4b0 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1e4c0 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1e4d0 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1e4e0 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1e4f0 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1e500 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1e510 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1e520 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1e530 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1e540 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1e550 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e560 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1e570 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1e580 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1e590 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1e5a0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1e5b0 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1e5c0 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1e5d0 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1e5e0 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1e5f0 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e 63 65  -time occurrance
1e600 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1e610 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1e620 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1e630 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1e640 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1e650 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1e660 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1e670 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e680 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1e690 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1e6a0 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1e6b0 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1e6c0 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1e6d0 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1e6e0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1e6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1e700 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1e710 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1e720 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1e730 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1e740 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1e750 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e760 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a   && dirfd>=0 ){.
1e770 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1e780 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 23  (dirfd, 0, 0);.#
1e790 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b  if OSCLOSE_CHECK
1e7a0 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20  _CLOSE_IOERR.   
1e7b0 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69     if( close(pFi
1e7c0 6c 65 2d 3e 64 69 72 66 64 29 20 29 7b 0a 20 20  le->dirfd) ){.  
1e7d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1e7e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1e7f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e800 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
1e810 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  OSE;.      }.#el
1e820 73 65 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  se.      robust_
1e830 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1e840 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23  fd, __LINE__);.#
1e850 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
1e860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1e870 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1e880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e890 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1e8a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1e8b0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1e8c0 3b 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ;..  }.  return 
1e8d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1e8e0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1e8f0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1e900 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1e910 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1e920 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1e930 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1e940 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e950 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1e960 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1e970 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1e980 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e990 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1e9a0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1e9b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1e9c0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1e9d0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1e9e0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1e9f0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1ea00 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1ea10 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1ea20 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1ea30 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1ea40 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1ea50 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1ea60 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1ea70 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1ea80 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1ea90 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1eaa0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1eab0 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79  Chunk ){.    nBy
1eac0 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
1ead0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
1eae0 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
1eaf0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1eb00 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
1eb10 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1eb20 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66  e(pFile->h, (off
1eb30 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
1eb40 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1eb50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1eb60 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1eb70 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1eb80 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1eb90 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1eba0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1ebb0 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1ebc0 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1ebd0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1ebe0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1ebf0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1ec00 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1ec10 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1ec20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ec30 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1ec40 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1ec50 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1ec60 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1ec70 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1ec80 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1ec90 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1eca0 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1ecb0 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1ecc0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1ecd0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1ece0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1ecf0 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1ed00 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1ed10 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1ed20 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1ed30 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1ed40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1ed50 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1ed60 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1ed70 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1ed80 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1ed90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1eda0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1edb0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1edc0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1edd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1ede0 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
1edf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ee00 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
1ee10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1ee20 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1ee30 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1ee40 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1ee50 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73   id );.  rc = os
1ee60 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  Fstat(((unixFile
1ee70 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
1ee80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1ee90 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1eea0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
1eeb0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1eec0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1eed0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
1eee0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1eef0 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
1ef00 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
1ef10 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
1ef20 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
1ef30 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49  abase, the findI
1ef40 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65  nodeInfo() proce
1ef50 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1ef60 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1ef70 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1ef80 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1ef90 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1efa0 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1efb0 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1efc0 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1efd0 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1efe0 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1eff0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1f000 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1f010 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1f020 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1f030 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1f040 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1f050 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1f060 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1f070 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1f080 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1f090 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f0a0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1f0b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1f0c0 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *.** Handler for
1f0d0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66   proxy-locking f
1f0e0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62  ile-control verb
1f0f0 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f  s.  Defined belo
1f100 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78  w in the.** prox
1f110 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76  ying locking div
1f120 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ision..*/.static
1f130 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
1f140 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1f150 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a  le*,int,void*);.
1f160 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54  #endif../* .** T
1f170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f180 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65  called to handle
1f190 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
1f1a0 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20  L_SIZE_HINT .** 
1f1b0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65  file-control ope
1f1c0 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65  ration.  Enlarge
1f1d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
1f1e0 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a   nBytes in size.
1f1f0 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74  ** (rounded up t
1f200 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
1f210 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20  -size).  If the 
1f220 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1f230 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72  ady.** nBytes or
1f240 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f   larger, this ro
1f250 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1f260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f270 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
1f280 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
1f290 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
1f2a0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1f2b0 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69  0 ){.    i64 nSi
1f2c0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1f2d0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
1f2e0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
1f2f0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1f300 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
1f310 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c    /* Used to hol
1f320 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  d return values 
1f330 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  of fstat() */.  
1f340 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61   .    if( osFsta
1f350 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
1f360 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1f370 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a  E_IOERR_FSTAT;..
1f380 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1f390 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1f3a0 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1f3b0 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1f3c0 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1f3d0 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1f3e0 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1f3f0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1f400 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1f410 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1f420 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1f430 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1f440 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1f450 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1f460 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1f470 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1f480 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1f490 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1f4a0 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1f4b0 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1f4c0 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1f4d0 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1f4e0 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1f4f0 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1f500 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1f510 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1f520 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1f530 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1f540 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1f550 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1f560 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1f570 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1f580 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1f590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f5a0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1f5b0 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1f5c0 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1f5d0 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1f5e0 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46  te(), fake it. F
1f5f0 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a  irst use.      *
1f600 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  * ftruncate() to
1f610 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69   set the file si
1f620 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ze, then write a
1f630 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a   single byte to.
1f640 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
1f650 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
1f660 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  lock within the 
1f670 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
1f680 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
1f690 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e  s the same techn
1f6a0 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69  ique used by gli
1f6b0 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  bc to implement 
1f6c0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1f6d0 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79  ).      ** on sy
1f6e0 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  stems that do no
1f6f0 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
1f700 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d  llocate() system
1f710 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a   call..      */.
1f720 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d        int nBlk =
1f730 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b   buf.st_blksize;
1f740 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d    /* File-system
1f750 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20   block size */. 
1f760 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b       i64 iWrite;
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
1f790 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a  to write to */..
1f7a0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1f7b0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1f7c0 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20  ->h, nSize) ){. 
1f7d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
1f7e0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1f7f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f800 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1f810 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1f820 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1f830 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1f840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57        }.      iW
1f850 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f  rite = ((buf.st_
1f860 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20  size + 2*nBlk - 
1f870 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b  1)/nBlk)*nBlk-1;
1f880 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57  .      while( iW
1f890 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20  rite<nSize ){.  
1f8a0 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1f8b0 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1f8c0 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1f8d0 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1f8e0 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72  f( nWrite!=1 ) r
1f8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1f900 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  RR_WRITE;.      
1f910 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b    iWrite += nBlk
1f920 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1f930 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1f940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f950 7d 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45  }..#if (SQLITE_E
1f960 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
1f970 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
1f980 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63 6c 75 64  APPLE__).#includ
1f990 65 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61  e "sqlite3_priva
1f9a0 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  te.h".#include <
1f9b0 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73 74 61 74  copyfile.h>.stat
1f9c0 69 63 20 69 6e 74 20 67 65 74 44 62 50 61 74 68  ic int getDbPath
1f9d0 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
1f9e0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
1f9f0 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64  r *dbPath);.#end
1fa00 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  if.static int is
1fa10 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
1fa20 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 0a 23  (unixFile *);..#
1fa30 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
1fa40 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
1fa50 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1fa60 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
1fa70 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61  unixTruncateData
1fa80 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  base(unixFile *p
1fa90 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73  File, int bFlags
1faa0 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ) {.  sqlite3_fi
1fab0 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65  le *id = (sqlite
1fac0 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  3_file *)pFile;.
1fad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fae0 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c  E_OK;.  void *pL
1faf0 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e  ock = NULL;.  in
1fb00 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69  t flags = 0;.  i
1fb10 6e 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f  nt corruptFileLo
1fb20 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  ck = 0;.  int is
1fb30 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  Corrupt = 0;.   
1fb40 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
1fb50 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1fb60 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70  ION.  flags |= p
1fb70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b  File->protFlags;
1fb80 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1fb90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1fba0 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73  G_STYLE.  if( is
1fbb0 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
1fbc0 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66  (pFile) ){.    f
1fbd0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
1fbe0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
1fbf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
1fc00 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
1fc10 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d  superlock(pFile-
1fc20 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73  >zPath, 0, flags
1fc30 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b  , 0, 0, &pLock);
1fc40 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1fc50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fc60 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53  CORRUPT || rc==S
1fc70 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a  QLITE_NOTADB ){.
1fc80 20 20 20 20 20 20 69 73 43 6f 72 72 75 70 74 20        isCorrupt 
1fc90 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1fca0 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
1fcb0 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  rlock_corrupt(id
1fcc0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
1fcd0 43 4c 55 53 49 56 45 2c 20 26 63 6f 72 72 75 70  CLUSIVE, &corrup
1fce0 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  tFileLock);.    
1fcf0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
1fd00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fd10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
1fd20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
1fd30 2d 3e 78 54 72 75 6e 63 61 74 65 28 69 64 2c 20  ->xTruncate(id, 
1fd40 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73  ((pFile->fsFlags
1fd50 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47   & SQLITE_FSFLAG
1fd60 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21 3d 20 30  S_IS_MSDOS) != 0
1fd70 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a 20 20  ) ? 1L : 0L);.  
1fd80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fd90 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 76  K ){.    unixInv
1fda0 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
1fdb0 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20  les(pFile, 0);. 
1fdc0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74   }.  pFile->pMet
1fdd0 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53  hod->xSync(id, S
1fde0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29  QLITE_SYNC_FULL)
1fdf0 3b 0a 0a 0a 20 20 69 66 28 20 69 73 43 6f 72 72  ;...  if( isCorr
1fe00 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  upt ){.    sqlit
1fe10 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
1fe20 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63  ck_corrupt(id, c
1fe30 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b  orruptFileLock);
1fe40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1fe50 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
1fe60 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
1fe70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1fe80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
1fe90 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
1fea0 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65  rtFiles(unixFile
1feb0 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69   *pFile, int ski
1fec0 70 57 41 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a  pWAL) {.  char j
1fed0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
1fee0 39 5d 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d  9];.  int zLen =
1fef0 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c 20   strlcpy(jPath, 
1ff00 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
1ff10 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69  XPATHLEN+9);.  i
1ff20 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c  f( zLen<MAXPATHL
1ff30 45 4e 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74  EN ){.    size_t
1ff40 20 6a 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74   jLen;.    const
1ff50 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 73   char extensions
1ff60 5b 33 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c  [3][9] = { "-wal
1ff70 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22  ", "-journal", "
1ff80 2d 73 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74  -shm" };.    int
1ff90 20 6a 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20   j = (skipWAL ? 
1ffa0 31 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  1 : 0);.    for(
1ffb0 20 3b 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20   ; j<3; j++ ){. 
1ffc0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43       .      /* C
1ffd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1ffe0 68 65 20 73 68 6d 20 66 69 6c 65 20 69 73 20 61  he shm file is a
1fff0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 66 6f  lready opened fo
20000 72 20 74 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a  r this pFile */.
20010 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29        if( j==2 )
20020 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 45 6e  {.        unixEn
20030 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
20040 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
20050 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
20060 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
20070 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d  .        unixShm
20080 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
20090 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
200a0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20  pShmNode;.      
200b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 26    if( pShmNode &
200c0 26 20 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  & !pShmNode->isR
200d0 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadonly ){.     
200e0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
200f0 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20   sStat;.        
20100 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20110 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
20120 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  mutex);.        
20130 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
20140 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20150 26 26 20 21 6f 73 46 73 74 61 74 28 70 53 68 6d  && !osFstat(pShm
20160 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  Node->h, &sStat)
20170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20180 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
20190 7a 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73  ze = (sStat.st_s
201a0 69 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73  ize<4) ? sStat.s
201b0 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20  t_size : 4;.    
201c0 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
201d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
201e0 20 20 20 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f      bzero(pShmNo
201f0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c  de->apRegion[0],
20200 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20   size);.        
20210 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20220 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
20230 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
20240 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65            unixLe
20250 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
20260 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
20270 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
20280 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
20290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
202a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
202b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
202c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
202d0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
202e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
202f0 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 26  jLen = strlcpy(&
20300 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74  jPath[zLen], ext
20310 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a  ensions[j], 9);.
20320 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c        if( jLen <
20330 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e   9 ){.        in
20340 74 20 6a 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29  t jflags = (j<2)
20350 20 3f 20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52   ? O_TRUNC : O_R
20360 44 57 52 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  DWR;.        int
20370 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74   jfd = open(jPat
20380 68 2c 20 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20  h, jflags);.    
20390 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31      if( jfd==(-1
203a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
203b0 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54  f( errno!=ENOENT
203c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
203d0 70 65 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20  perror(jPath);. 
203e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
203f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
20400 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29        if( j==2 )
20410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
20420 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
20430 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20440 20 21 6f 73 46 73 74 61 74 28 6a 66 64 2c 20 26   !osFstat(jfd, &
20450 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
20460 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
20470 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53   long size = (sS
20480 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f  tat.st_size<4) ?
20490 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a   sStat.st_size :
204a0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   4;.            
204b0 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a    if( size>0 ){.
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 75 69 6e 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20  uint32_t zero = 
204e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
204f0 20 20 20 70 77 72 69 74 65 28 6a 66 64 2c 20 26     pwrite(jfd, &
20500 7a 65 72 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69  zero, (size_t)si
20510 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
20520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20540 7d 0a 20 20 20 20 20 20 20 20 20 20 66 73 79 6e  }.          fsyn
20550 63 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  c(jfd);.        
20560 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20    close(jfd);.  
20570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
205a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
205b0 52 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28  ReplaceDatabase(
205c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
205d0 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29   sqlite3 *srcdb)
205e0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
205f0 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
20600 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
20610 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65   Btree *pSrcBtre
20620 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69  e = NULL;.  sqli
20630 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69  te3_file *src_fi
20640 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69  le = NULL;.  uni
20650 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20  xFile *pSrcFile 
20660 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73  = NULL;.  char s
20670 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  rcWalPath[MAXPAT
20680 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73  HLEN+5];.  int s
20690 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20  rcWalFD = -1;.  
206a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
206b0 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63  OK;.  void *pLoc
206c0 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  k = NULL;.  int 
206d0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
206e0 69 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e  ite3 *srcdb2 = N
206f0 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f  ULL;.  copyfile_
20700 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74  state_t s;.  int
20710 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c   corruptSrcFileL
20720 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ock = 0;.  int c
20730 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63  orruptDstFileLoc
20740 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  k = 0;.  int isS
20750 72 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  rcCorrupt = 0;. 
20760 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70   int isDstCorrup
20770 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20  t = 0;.  .  if( 
20780 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
20790 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a  eckOk(srcdb) ){.
207a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
207b0 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
207c0 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
207d0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
207e0 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
207f0 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
20800 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
20810 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20820 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
20830 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
20840 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
20850 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
20860 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
20870 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
20880 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
20890 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
208a0 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
208b0 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
208c0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
208d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
208e0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
208f0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
20900 0a 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72  .      isDstCorr
20910 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  upt = 1;.      r
20920 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
20930 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
20940 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  t(id, SQLITE_LOC
20950 4b 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63 6f  K_EXCLUSIVE, &co
20960 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b  rruptDstFileLock
20970 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
20990 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
209a0 7d 0a 20 20 2f 2a 20 67 65 74 20 74 68 65 20 73  }.  /* get the s
209b0 72 63 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  rc file descript
209c0 6f 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20 74  or adhering to t
209d0 68 65 20 64 62 20 73 74 72 75 63 74 20 61 63 63  he db struct acc
209e0 65 73 73 20 72 75 6c 65 73 20 0a 20 20 20 2a 2a  ess rules .   **
209f0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
20a00 64 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69  deled after sqli
20a10 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
20a20 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20  () in main.c.   
20a30 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  */ .  sqlite3_mu
20a40 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62 2d  tex_enter(srcdb-
20a50 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  >mutex);.  if( s
20a60 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20  rcdb->nDb>0 ){. 
20a70 20 20 20 70 53 72 63 42 74 72 65 65 20 3d 20 73     pSrcBtree = s
20a80 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  rcdb->aDb[0].pBt
20a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
20aa0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
20ab0 65 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a 20  er *pSrcPager;. 
20ac0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
20ad0 6e 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  nter(pSrcBtree);
20ae0 0a 20 20 20 20 70 53 72 63 50 61 67 65 72 20 3d  .    pSrcPager =
20af0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
20b00 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20  er(pSrcBtree);. 
20b10 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 50     assert( pSrcP
20b20 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 73  ager!=0 );.    s
20b30 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65  rc_file = sqlite
20b40 33 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50  3PagerFile(pSrcP
20b50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
20b60 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20 29  t( src_file!=0 )
20b70 3b 0a 20 20 20 20 69 66 28 20 73 72 63 5f 66 69  ;.    if( src_fi
20b80 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  le->pMethods ){.
20b90 20 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c 61        int srcFla
20ba0 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  gs = 0;.      pS
20bb0 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  rcFile = (unixFi
20bc0 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a 20  le *)src_file;. 
20bd0 20 20 20 20 20 2f 2a 20 77 61 6c 20 6d 6f 64 65       /* wal mode
20be0 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70   db cannot be op
20bf0 65 6e 65 64 20 72 65 61 64 6f 6e 6c 79 20 2a 2f  ened readonly */
20c00 0a 20 20 20 20 20 20 69 66 20 28 28 70 53 72 63  .      if ((pSrc
20c10 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
20c20 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52  & O_RDWR) == O_R
20c30 44 57 52 29 20 7b 0a 20 20 20 20 20 20 20 20 73  DWR) {.        s
20c40 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  rcFlags = SQLITE
20c50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
20c60 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
20c70 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
20c80 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
20c90 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
20ca0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
20cb0 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
20cc0 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c 61 67  ON.      srcFlag
20cd0 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e 70  s |= pSrcFile->p
20ce0 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66  rotFlags;.#endif
20cf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
20d00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20d10 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f  .      if( isPro
20d20 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 53  xyLockingMode(pS
20d30 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  rcFile) ){.     
20d40 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 53     srcFlags |= S
20d50 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
20d60 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ROXY;.      }.#e
20d70 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
20d80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
20d90 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  pSrcFile->zPath,
20da0 20 26 73 72 63 64 62 32 2c 20 73 72 63 46 6c 61   &srcdb2, srcFla
20db0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
20dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20dd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 74  ){.        /* st
20de0 61 72 74 20 61 20 64 65 66 65 72 72 65 64 20 74  art a deferred t
20df0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
20e00 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69 73 68  ead to establish
20e10 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
20e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20e30 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62 32  ite3_exec(srcdb2
20e40 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52 52 45  , "BEGIN DEFERRE
20e50 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  D; PRAGMA schema
20e60 5f 76 65 72 73 69 6f 6e 22 2c 20 30 2c 20 30 2c  _version", 0, 0,
20e70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
20e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
20e90 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  UPT || rc==SQLIT
20ea0 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20  E_NOTADB ){.    
20eb0 20 20 20 20 20 20 69 73 53 72 63 43 6f 72 72 75        isSrcCorru
20ec0 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  pt = 1;.        
20ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
20ee0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
20ef0 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 53  rupt(src_file, S
20f00 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
20f10 44 2c 20 26 63 6f 72 72 75 70 74 53 72 63 46 69  D, &corruptSrcFi
20f20 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  leLock);.       
20f30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20f40 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 72 63 64  .  }.  if( !srcd
20f50 62 32 20 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d  b2 || pSrcFile==
20f60 4e 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65  NULL || pSrcFile
20f70 2d 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63 20 3d  ->h<0){.    rc =
20f80 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
20f90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
20fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20fb0 20 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63   goto end_replac
20fc0 65 5f 64 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a  e_database;.  }.
20fd0 20 20 2f 2a 20 62 6f 74 68 20 64 61 74 61 62 61    /* both databa
20fe0 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20 61  ses are locked a
20ff0 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 63 6f  ppropriately, co
21000 70 79 20 74 68 65 20 73 72 63 20 77 61 6c 20 6a  py the src wal j
21010 6f 75 72 6e 61 6c 20 69 66 20 0a 20 20 20 2a 2a  ournal if .   **
21020 20 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64 20   one exists and 
21030 74 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  then the actual 
21040 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
21050 20 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28 73 72   */.  strlcpy(sr
21060 63 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69  cWalPath, pSrcFi
21070 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
21080 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74 72 6c  THLEN+5);.  strl
21090 63 61 74 28 73 72 63 57 61 6c 50 61 74 68 2c 20  cat(srcWalPath, 
210a0 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c  "-wal", MAXPATHL
210b0 45 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61 6c 46  EN+5);.  srcWalF
210c0 44 20 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c 50  D = open(srcWalP
210d0 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  ath, O_RDONLY);.
210e0 20 20 69 66 28 20 21 28 73 72 63 57 61 6c 46 44    if( !(srcWalFD
210f0 3c 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  <0) ){.    char 
21100 64 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41  dstWalPath[MAXPA
21110 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e  THLEN+5];.    in
21120 74 20 64 73 74 57 61 6c 46 44 20 3d 20 2d 31 3b  t dstWalFD = -1;
21130 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74  .    strlcpy(dst
21140 57 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  WalPath, pFile->
21150 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
21160 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61  N+5);.    strlca
21170 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d  t(dstWalPath, "-
21180 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  wal", MAXPATHLEN
21190 2b 35 29 3b 0a 20 20 20 20 64 73 74 57 61 6c 46  +5);.    dstWalF
211a0 44 20 3d 20 6f 70 65 6e 28 64 73 74 57 61 6c 50  D = open(dstWalP
211b0 61 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ath, O_RDWR|O_CR
211c0 45 41 54 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  EAT, SQLITE_DEFA
211d0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
211e0 49 4f 4e 53 29 3b 0a 20 20 20 20 69 66 28 20 21  IONS);.    if( !
211f0 28 64 73 74 57 61 6c 46 44 3c 30 29 20 29 7b 0a  (dstWalFD<0) ){.
21200 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69        s = copyfi
21210 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
21220 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 73 72  ;.      lseek(sr
21230 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f  cWalFD, 0, SEEK_
21240 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65  SET);.      lsee
21250 6b 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53  k(dstWalFD, 0, S
21260 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20  EEK_SET);.      
21270 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 73 72  if( fcopyfile(sr
21280 63 57 61 6c 46 44 2c 20 64 73 74 57 61 6c 46 44  cWalFD, dstWalFD
21290 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 41 4c  , s, COPYFILE_AL
212a0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  L) ){.        in
212b0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
212c0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
212d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   {.          cas
212e0 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
212f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21300 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
21310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21320 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
21330 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
21340 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
21350 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
21360 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21380 20 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69    }.      copyfi
21390 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29  le_state_free(s)
213a0 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 64 73  ;.      close(ds
213b0 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20  tWalFD);.    }. 
213c0 20 20 20 63 6c 6f 73 65 28 73 72 63 57 61 6c 46     close(srcWalF
213d0 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  D);.  }.  if( rc
213e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
213f0 20 20 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20     /* before we 
21400 63 6f 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61  copy, ensure tha
21410 74 20 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67  t the file chang
21420 65 20 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62  e counter will b
21430 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  e modified */.  
21440 20 20 75 69 6e 74 33 32 5f 74 20 73 72 63 43 68    uint32_t srcCh
21450 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 75 69  ange = 0;.    ui
21460 6e 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65  nt32_t dstChange
21470 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 61 64 28   = 0;.    pread(
21480 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72  pSrcFile->h, &sr
21490 63 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b  cChange, 4, 24);
214a0 0a 20 20 20 20 70 72 65 61 64 28 70 46 69 6c 65  .    pread(pFile
214b0 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c  ->h, &dstChange,
214c0 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20 20   4, 24);.    .  
214d0 20 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63    /* copy the ac
214e0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f  tual database */
214f0 0a 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c  .    s = copyfil
21500 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b  e_state_alloc();
21510 0a 20 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46  .    lseek(pSrcF
21520 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f  ile->h, 0, SEEK_
21530 53 45 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28  SET);.    lseek(
21540 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45  pFile->h, 0, SEE
21550 4b 5f 53 45 54 29 3b 0a 20 20 20 20 69 66 28 20  K_SET);.    if( 
21560 66 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69  fcopyfile(pSrcFi
21570 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  le->h, pFile->h,
21580 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 41 4c 4c   s, COPYFILE_ALL
21590 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
215a0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
215b0 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
215c0 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
215d0 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  M:.          rc 
215e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
215f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21600 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
21610 3a 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  :.          pFil
21620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
21630 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  rr;.          rc
21640 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
21650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21660 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74     copyfile_stat
21670 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20 20 0a  e_free(s);.    .
21680 20 20 20 20 69 66 20 28 73 72 63 43 68 61 6e 67      if (srcChang
21690 65 20 3d 3d 20 64 73 74 43 68 61 6e 67 65 29 20  e == dstChange) 
216a0 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f 64 69 66  {.      /* modif
216b0 79 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  y the change cou
216c0 6e 74 65 72 20 74 6f 20 66 6f 72 63 65 20 70 61  nter to force pa
216d0 67 65 20 7a 65 72 6f 20 74 6f 20 62 65 20 72 65  ge zero to be re
216e0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20 20 20 20  loaded */.      
216f0 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b 0a 20 20  dstChange ++;.  
21700 20 20 20 20 70 77 72 69 74 65 28 70 46 69 6c 65      pwrite(pFile
21710 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c  ->h, &dstChange,
21720 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20   4, 24);.    }. 
21730 20 7d 0a 20 20 69 66 28 20 69 73 53 72 63 43 6f   }.  if( isSrcCo
21740 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c  rrupt ){.    sql
21750 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
21760 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63  lock_corrupt(src
21770 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70 74 53 72  _file, corruptSr
21780 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65  cFileLock);.  }e
21790 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64 6f 6e 65  lse{.    /* done
217a0 20 77 69 74 68 20 74 68 65 20 73 6f 75 72 63 65   with the source
217b0 20 64 62 20 73 6f 20 65 6e 64 20 74 68 65 20 74   db so end the t
217c0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
217d0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73    sqlite3_exec(s
217e0 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49 54 22 2c  rcdb2, "COMMIT",
217f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
21800 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20 61 6e 79   /* zero out any
21810 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6c 75   old journal clu
21820 74 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 72 63  tter */.  if( rc
21830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21840 20 20 20 69 6e 74 20 73 6b 69 70 57 41 4c 20 3d     int skipWAL =
21850 20 28 73 72 63 57 61 6c 46 44 3c 30 29 3f 30 3a   (srcWalFD<0)?0:
21860 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e 76 61 6c  1;.    unixInval
21870 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65  idateSupportFile
21880 73 28 70 46 69 6c 65 2c 20 73 6b 69 70 57 41 4c  s(pFile, skipWAL
21890 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 72 65  );.  }.  .end_re
218a0 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3a 0a  place_database:.
218b0 20 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20    if( pSrcBtree 
218c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
218d0 6c 6f 73 65 28 73 72 63 64 62 32 29 3b 0a 20 20  lose(srcdb2);.  
218e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
218f0 61 76 65 28 70 53 72 63 42 74 72 65 65 29 3b 0a  ave(pSrcBtree);.
21900 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
21910 74 65 78 5f 6c 65 61 76 65 28 73 72 63 64 62 2d  tex_leave(srcdb-
21920 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 69  >mutex);.  if( i
21930 73 44 73 74 43 6f 72 72 75 70 74 20 29 7b 0a 20  sDstCorrupt ){. 
21940 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
21950 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
21960 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74 44 73  pt(id, corruptDs
21970 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65  tFileLock);.  }e
21980 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
21990 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
219a0 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72  (pLock);.  }.  r
219b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 64 65 66  eturn rc;.}.#def
219c0 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ine SQLITE_FILE_
219d0 48 45 41 44 45 52 5f 4c 45 4e 20 31 36 0a 2f 2a  HEADER_LEN 16./*
219e0 20 43 68 65 63 6b 20 66 6f 72 20 61 20 63 6f 6e   Check for a con
219f0 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20  flicting lock.  
21a00 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
21a10 20 70 72 69 6e 74 20 61 6e 20 74 68 69 73 0a 20   print an this. 
21a20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f  ** on standard o
21a30 75 74 70 75 74 20 75 73 69 6e 67 20 74 68 65 20  utput using the 
21a40 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 67 69  format string gi
21a50 76 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ven and return 1
21a60 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61  .. ** If there a
21a70 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e  re no conflictin
21a80 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75 72 6e 20  g locks, return 
21a90 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  0.. */.static in
21aa0 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 0a  t unixIsLocked(.
21ab0 20 20 70 69 64 5f 74 20 70 69 64 2c 20 20 20 20    pid_t pid,    
21ac0 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44 20 74          /* PID t
21ad0 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f 63 6b 20  o test for lock 
21ae0 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68  owner */.  int h
21af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21b00 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
21b10 74 6f 72 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  tor to check */.
21b20 20 20 69 6e 74 20 74 79 70 65 2c 20 20 20 20 20    int type,     
21b30 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 52 44 4c          /* F_RDL
21b40 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  CK or F_WRLCK */
21b50 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
21b60 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46 69 72 73  iOfst,   /* Firs
21b70 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
21b80 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
21b90 20 69 6e 74 20 69 43 6e 74 2c 20 20 20 20 2f 2a   int iCnt,    /*
21ba0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
21bb0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20 72 61 6e   in the lock ran
21bc0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ge */.  const ch
21bd0 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
21be0 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f   Type of lock */
21bf0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
21c00 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20 65 72 72  ck lk;.  int err
21c10 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 6c  ;.  .  memset(&l
21c20 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6b 29  k, 0, sizeof(lk)
21c30 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d  );.  lk.l_type =
21c40 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68   type;.  lk.l_wh
21c50 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
21c60 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74 20 3d 20  .  lk.l_start = 
21c70 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65  iOfst;.  lk.l_le
21c80 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a 20 20 69  n = iCnt;.  .  i
21c90 66 28 20 70 69 64 21 3d 53 51 4c 49 54 45 5f 4c  f( pid!=SQLITE_L
21ca0 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20  OCKSTATE_ANYPID 
21cb0 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f 47 45 54  ){.#ifndef F_GET
21cc0 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69 6e 67 20  LKPID.# warning 
21cd0 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e 64 65 66  F_GETLKPID undef
21ce0 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65 33 5f 6c  ined, _sqlite3_l
21cf0 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c 69 6e 67  ockstate falling
21d00 20 62 61 63 6b 20 74 6f 20 46 5f 47 45 54 4c 4b   back to F_GETLK
21d10 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c  .    err = fcntl
21d20 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b  (h, F_GETLK, &lk
21d30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6c 6b 2e  );.#else.    lk.
21d40 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a 20 20 20  l_pid = pid;.   
21d50 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
21d60 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26 6c 6b 29  F_GETLKPID, &lk)
21d70 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
21d80 7b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74  {.    err = fcnt
21d90 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  l(h, F_GETLK, &l
21da0 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  k);.  }.  .  if(
21db0 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   err==(-1) ){.  
21dc0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
21dd0 2c 20 22 66 63 6e 74 6c 28 25 64 29 20 66 61 69  , "fcntl(%d) fai
21de0 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64 5c 6e 22  led: errno=%d\n"
21df0 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  , h, errno);.   
21e00 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
21e10 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c 5f 74 79    .  if( lk.l_ty
21e20 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26 26 20 28  pe!=F_UNLCK && (
21e30 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b  pid==SQLITE_LOCK
21e40 53 54 41 54 45 5f 41 4e 59 50 49 44 20 7c 7c 20  STATE_ANYPID || 
21e50 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64 29 20 29  lk.l_pid==pid) )
21e60 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
21e70 44 45 42 55 47 0a 20 20 20 20 66 70 72 69 6e 74  DEBUG.    fprint
21e80 66 28 73 74 64 65 72 72 2c 20 22 25 73 20 6c 6f  f(stderr, "%s lo
21e90 63 6b 20 68 65 6c 64 20 62 79 20 25 64 5c 6e 22  ck held by %d\n"
21ea0 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 6b  , zType, (int)lk
21eb0 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64 69 66 0a  .l_pid);.#endif.
21ec0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21ed0 7d 20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  } .  return 0;.}
21ee0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 65 73  ../*.** This tes
21ef0 74 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  t only works for
21f00 20 6c 6f 63 6b 20 74 65 73 74 69 6e 67 20 6f 6e   lock testing on
21f10 20 75 6e 69 78 2f 70 6f 73 69 78 20 56 46 53 2e   unix/posix VFS.
21f20 0a 2a 2a 20 41 64 61 70 74 65 64 20 66 72 6f 6d  .** Adapted from
21f30 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e 63 20   tool/getlock.c 
21f40 66 34 63 33 39 62 36 35 31 33 37 30 31 35 36 63  f4c39b651370156c
21f50 61 65 39 37 39 35 30 31 61 37 62 31 35 36 62 64  ae979501a7b156bd
21f60 62 61 35 30 65 37 63 65 0a 2a 2f 0a 73 74 61 74  ba50e7ce.*/.stat
21f70 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73  ic int unixLocks
21f80 74 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65  tatePid(unixFile
21f90 20 2a 70 46 69 6c 65 2c 20 70 69 64 5f 74 20 70   *pFile, pid_t p
21fa0 69 64 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b 73 74  id, int *pLockst
21fb0 61 74 65 29 7b 0a 20 20 69 6e 74 20 68 44 62 3b  ate){.  int hDb;
21fc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
21fd0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
21fe0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
21ff0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
22000 53 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20 46 69  Shm = -1;  /* Fi
22010 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
22020 72 20 57 41 4c 20 73 68 61 72 65 64 2d 6d 65 6d  r WAL shared-mem
22030 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 73 73  ory file */.  ss
22040 69 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f 2a  ize_t got;    /*
22050 20 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   Bytes read from
22060 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
22070 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
22080 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22090 69 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a  if in WAL mode *
220a0 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20 3d 20  /.  int nLock = 
220b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
220c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
220d0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
220e0 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
220f0 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  00];   /* Databa
22100 73 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a  se header */.  .
22110 20 20 61 73 73 65 72 74 28 70 4c 6f 63 6b 73 74    assert(pLockst
22120 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61  ate);.  .  /* ma
22130 6b 65 20 73 75 72 65 20 77 65 20 61 72 65 20 64  ke sure we are d
22140 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61  ealing with a da
22150 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
22160 20 68 44 62 20 3d 20 70 46 69 6c 65 2d 3e 68 3b   hDb = pFile->h;
22170 0a 20 20 69 66 28 20 68 44 62 3c 30 20 29 7b 0a  .  if( hDb<0 ){.
22180 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
22190 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
221a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
221b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
221c0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
221d0 20 28 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f   (strlen(SQLITE_
221e0 46 49 4c 45 5f 48 45 41 44 45 52 29 2b 31 29 3d  FILE_HEADER)+1)=
221f0 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  =SQLITE_FILE_HEA
22200 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20 67 6f 74  DER_LEN );.  got
22210 20 3d 20 70 72 65 61 64 28 68 44 62 2c 20 61 48   = pread(hDb, aH
22220 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69  dr, 100, 0);.  i
22230 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
22240 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
22250 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
22260 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
22270 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22280 20 7d 0a 20 20 69 66 28 20 67 6f 74 21 3d 31 30   }.  if( got!=10
22290 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 48 64 72  0 || memcmp(aHdr
222a0 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45  , SQLITE_FILE_HE
222b0 41 44 45 52 2c 20 53 51 4c 49 54 45 5f 46 49 4c  ADER, SQLITE_FIL
222c0 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29 21 3d 30  E_HEADER_LEN)!=0
222d0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
222e0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
222f0 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  KSTATE_NOTADB;. 
22300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22310 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a 20 20 0a  _NOTADB;.  }.  .
22320 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
22330 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
22340 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63  e lock */.  nLoc
22350 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65  k += unixIsLocke
22360 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 52 44  d(pid, hDb, F_RD
22370 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46 49 52 53  LCK, SHARED_FIRS
22380 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  T, SHARED_SIZE, 
22390 22 45 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20  "EXCLUSIVE");.  
223a0 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d  isWal = aHdr[18]
223b0 3d 3d 32 3b 0a 20 20 69 66 28 20 6e 4c 6f 63 6b  ==2;.  if( nLock
223c0 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d 3d 30 20  ==0 && isWal==0 
223d0 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61  ){.    /* Rollba
223e0 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6e  ck mode */.    n
223f0 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f  Lock += unixIsLo
22400 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46  cked(pid, hDb, F
22410 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47 5f  _WRLCK, PENDING_
22420 42 59 54 45 2c 20 53 48 41 52 45 44 5f 53 49 5a  BYTE, SHARED_SIZ
22430 45 2b 32 2c 20 22 50 45 4e 44 49 4e 47 7c 52 45  E+2, "PENDING|RE
22440 53 45 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b  SERVED|SHARED");
22450 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b  .  }.  if( nLock
22460 3d 3d 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20  ==0 && isWal!=0 
22470 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70  ){.    /* lookup
22480 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22490 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61  ptor for the sha
224a0 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red memory file 
224b0 69 66 20 77 65 20 68 61 76 65 20 69 74 20 6f 70  if we have it op
224c0 65 6e 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  en in this proce
224d0 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e  ss */.    unixEn
224e0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
224f0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
22500 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
22510 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
22520 0a 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  .    unixShmNode
22530 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69   *pShmNode = pFi
22540 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
22550 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 70 53  Node;.    if( pS
22560 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  hmNode ){.      
22570 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
22580 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
22590 74 65 78 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  tex);.      .   
225a0 20 20 20 68 53 68 6d 20 3d 20 70 53 68 6d 4e 6f     hShm = pShmNo
225b0 64 65 2d 3e 68 3b 0a 20 20 20 20 20 20 69 66 28  de->h;.      if(
225c0 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20 20 20   hShm >= 0){.   
225d0 20 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c       if( unixIsL
225e0 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
225f0 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45   F_RDLCK, SHM_RE
22600 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52  COVER, 1, "WAL-R
22610 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20  ECOVERY") ||.   
22620 20 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f          unixIsLo
22630 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
22640 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49  F_RDLCK, SHM_WRI
22650 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54  TE, 1, "WAL-WRIT
22660 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E") ){.         
22670 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20   nLock = 1;.    
22680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22690 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
226a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
226b0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
226c0 0a 20 20 20 20 7d 20 0a 20 20 20 20 0a 20 20 20  .    } .    .   
226d0 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20   if( hShm<0 ){. 
226e0 20 20 20 20 20 2f 2a 20 74 68 65 20 73 68 61 72       /* the shar
226f0 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69  ed memory file i
22700 73 6e 27 74 20 6f 70 65 6e 20 69 6e 20 74 68 69  sn't open in thi
22710 73 20 70 72 6f 63 65 73 73 20 73 70 61 63 65 2c  s process space,
22720 20 6f 70 65 6e 20 6f 75 72 20 6f 77 6e 20 46 44   open our own FD
22730 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a   */.      char z
22740 53 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  Shm[MAXPATHLEN];
22750 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
22760 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20   WAL mode */.   
22770 20 20 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c     strlcpy(zShm,
22780 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
22790 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
227a0 20 20 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20    strlcat(zShm, 
227b0 22 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c  "-shm", MAXPATHL
227c0 45 4e 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20  EN);.      hShm 
227d0 3d 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  = open(zShm, O_R
227e0 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
227f0 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20   if( hShm<0 ){. 
22800 20 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61         *pLocksta
22810 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
22820 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20  STATE_OFF;.     
22830 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
22840 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  x();.        ret
22850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22870 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
22880 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
22890 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31  , SHM_RECOVER, 1
228a0 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22  , "WAL-RECOVERY"
228b0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e  ) ||.         un
228c0 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
228d0 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
228e0 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41  HM_WRITE, 1, "WA
228f0 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20  L-WRITE") ){.   
22900 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a       nLock = 1;.
22910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
22920 6f 73 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d  ose(hShm);.    }
22930 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
22940 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tex();.  }.  if(
22950 20 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20   nLock>0 ){.    
22960 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
22970 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f  LITE_LOCKSTATE_O
22980 4e 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  N;.  } else {.  
22990 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
229a0 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
229b0 5f 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _OFF;.  }.  retu
229c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
229d0 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49  .#endif /* (SQLI
229e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
229f0 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
22a00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
22a10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
22a20 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
22a30 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
22a40 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
22a50 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
22a60 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
22a70 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
22a80 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
22a90 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
22aa0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
22ab0 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
22ac0 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
22ad0 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
22ae0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
22af0 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
22b00 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
22b10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
22b20 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
22b30 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
22b40 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
22b50 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
22b60 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
22b70 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
22b80 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
22b90 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
22ba0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
22bb0 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
22bc0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
22bd0 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
22be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  .}../*.** Inform
22bf0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
22c00 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
22c10 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
22c20 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
22c30 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
22c40 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
22c50 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
22c60 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
22c70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
22c80 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
22c90 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
22ca0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
22cb0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
22cc0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
22cd0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
22ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22cf0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
22d00 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
22d10 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
22d20 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
22d30 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
22d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22d50 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
22d60 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
22d70 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
22d80 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
22d90 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
22da0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
22db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22dc0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
22dd0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
22de0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
22df0 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
22e00 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
22e10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
22e20 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
22e30 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
22e40 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
22e50 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
22e60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
22e70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
22e80 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
22e90 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
22ea0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
22eb0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
22ec0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
22ed0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
22ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22f00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
22f10 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
22f20 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
22f30 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
22f40 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
22f50 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
22f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22f80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
22f90 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
22fa0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
22fb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
22fc0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
22fd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
22fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ff0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23000 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  NDEBUG.    /* Th
23010 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
23020 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
23030 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
23040 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
23050 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
23060 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
23070 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
23080 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
23090 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
230a0 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
230b0 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
230c0 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
230d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
230e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
230f0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
23100 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
23110 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
23120 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
23130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23140 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
23150 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
23160 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23170 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
23180 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
23190 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
231a0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
231b0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
231c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
231d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
231e0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
231f0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
23200 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
23210 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
23220 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
23230 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
23240 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
23250 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
23260 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
23270 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
23280 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
23290 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
232a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
232b0 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
232c0 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
232d0 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
232e0 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
232f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
23300 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
23310 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
23320 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
23330 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
23340 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
23350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
23360 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
23370 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
23380 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
23390 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
233a0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
233b0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
233c0 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
233d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
233e0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
233f0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
23400 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
23410 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
23420 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
23430 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
23440 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
23450 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
23460 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
23470 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23480 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
23490 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
234a0 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
234b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
234c0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
234d0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
234e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
234f0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
23500 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
23510 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
23520 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
23530 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
23540 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
23550 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
23560 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
23570 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
23580 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
23590 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
235a0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
235b0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
235c0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
235d0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
235e0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
235f0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
23600 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
23610 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
23620 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
23630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
23640 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
23650 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
23660 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
23670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23680 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
23690 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
236a0 6c 65 29 7b 0a 20 20 28 76 6f 69 64 29 70 46 69  le){.  (void)pFi
236b0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
236c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
236d0 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
236e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
236f0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
23700 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
23710 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
23720 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
23730 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
23740 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
23750 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
23760 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
23770 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
23780 74 72 61 76 65 72 73 69 61 6c 20 73 69 6e 63 65  traversial since
23790 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
237a0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
237b0 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
237c0 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
237d0 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
237e0 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
237f0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
23800 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
23810 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
23820 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
23830 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
23840 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
23850 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
23860 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
23870 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
23880 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
23890 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
238a0 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
238b0 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
238c0 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
238d0 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
238e0 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
238f0 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
23900 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
23910 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
23920 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
23930 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
23940 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
23950 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
23960 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
23970 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
23980 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
23990 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
239a0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
239b0 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
239c0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
239d0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
239e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
239f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
23a00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
23a10 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67   if( p->ctrlFlag
23a20 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  s & UNIXFILE_PSO
23a30 57 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  W ){.    return 
23a40 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
23a50 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
23a60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
23a70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
23a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23a90 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20  MIT_WAL.../*.** 
23aa0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
23ab0 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
23ac0 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
23ad0 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
23ae0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
23af0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
23b00 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
23b10 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
23b20 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
23b30 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
23b40 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
23b50 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
23b60 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
23b70 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
23b80 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
23b90 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
23ba0 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
23bb0 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
23bc0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
23bd0 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
23be0 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
23bf0 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
23c00 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
23c10 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
23c20 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
23c30 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
23c40 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
23c50 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
23c60 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
23c70 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
23c80 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
23c90 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
23ca0 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
23cb0 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
23cc0 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
23cd0 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
23ce0 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
23cf0 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
23d00 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
23d10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
23d20 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
23d30 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
23d40 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
23d50 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
23d60 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
23d70 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
23d80 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
23d90 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
23da0 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
23db0 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
23dc0 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
23dd0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
23de0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
23df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
23e00 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
23e10 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
23e20 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
23e30 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
23e40 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
23e50 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
23e60 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
23e70 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
23e80 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
23e90 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
23ea0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
23eb0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
23ec0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
23ed0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
23ee0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
23ef0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
23f00 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
23f10 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
23f20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
23f30 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
23f40 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
23f50 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
23f60 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
23f70 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
23f80 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
23f90 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
23fa0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
23fb0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
23fc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23fd0 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
23fe0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
24010 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
24020 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
24030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24040 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
24050 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
24060 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
24070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24080 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
24090 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
240a0 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
240b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
240c0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
240d0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
240e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
240f0 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
24100 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
24110 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
24120 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
24130 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24140 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
24150 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
24160 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
24170 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
24180 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
24190 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
241a0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
241b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
241c0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241e0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
241f0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
24200 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
24210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24220 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
24230 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
24240 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
24250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
24260 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
24270 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
24280 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
24290 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
242a0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
242b0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
242c0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
242d0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
242e0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
242f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
24300 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
24310 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
24320 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
24330 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
24340 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
24350 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
24360 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
24370 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
24380 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
24390 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
243a0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
243b0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
243c0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
243d0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
243e0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
243f0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
24400 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
24410 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
24420 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
24430 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
24440 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
24450 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
24460 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
24470 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
24480 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
24490 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
244a0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
244b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
244c0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
244d0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
244e0 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
24510 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
24520 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
24530 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
24540 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
24550 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
24560 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
24570 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
24580 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
24590 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
245a0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
245b0 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
245c0 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
245d0 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
245e0 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
245f0 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
24600 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
24610 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
24620 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
24630 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
24640 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
24650 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
24660 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
24670 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
24680 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
24690 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
246a0 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
246b0 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
246c0 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
246d0 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
246e0 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
246f0 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
24700 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
24710 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
24720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
24730 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
24740 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
24750 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c  ShmNode, /* Appl
24760 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
24770 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
24780 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
24790 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
247a0 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
247b0 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
247c0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
247d0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
247e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
247f0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
24800 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
24830 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
24840 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
24850 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
24860 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
24870 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
24880 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
24890 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
248a0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
248b0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
248c0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
248d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
248e0 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
248f0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
24900 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
24910 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24920 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24930 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
24940 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
24950 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
24960 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
24970 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
24980 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
24990 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
249a0 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
249b0 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
249c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
249d0 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
249e0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
249f0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
24a00 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
24a10 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
24a20 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
24a30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
24a40 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
24a50 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
24a60 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
24a70 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
24a80 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
24a90 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
24aa0 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
24ab0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
24ac0 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
24ad0 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
24ae0 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
24af0 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
24b00 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
24b10 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
24b20 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
24b30 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
24b40 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
24b50 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
24b60 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
24b70 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
24b80 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
24b90 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
24ba0 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
24bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24bc0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
24bd0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
24be0 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
24bf0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
24c00 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
24c10 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
24c20 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
24c30 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
24c40 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
24c50 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
24c60 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
24c70 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
24c80 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
24c90 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
24ca0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
24cb0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
24cc0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
24cd0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
24ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
24cf0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
24d00 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
24d10 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
24d20 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
24d30 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
24d40 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
24d50 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
24d60 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
24d70 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24d80 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
24d90 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
24da0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
24db0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
24dc0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
24dd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
24de0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
24df0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
24e00 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
24e10 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
24e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
24e30 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
24e40 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
24e50 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
24e60 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
24e70 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
24e80 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
24e90 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
24ea0 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
24eb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
24ec0 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
24ed0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
24ee0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
24ef0 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
24f00 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67   .}.../*.** Purg
24f10 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
24f20 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
24f30 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
24f40 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
24f50 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
24f60 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
24f70 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
24f80 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
24f90 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
24fa0 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
24fb0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
24fc0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
24fd0 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
24fe0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
24ff0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
25000 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
25010 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
25020 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
25030 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
25040 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
25050 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
25060 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
25070 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
25080 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
25090 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
250a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
250b0 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
250c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
250d0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
250e0 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  munmap(p->apRegi
250f0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
25100 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
25110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25120 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
25130 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
25140 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25150 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
25160 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
25170 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
25180 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
25190 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
251a0 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
251b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
251c0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
251d0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
251e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
251f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
25200 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d  ar *proxySharedM
25210 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e  emoryBasePath(un
25220 69 78 46 69 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a  ixFile *);../*.*
25230 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
25240 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
25250 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
25260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
25270 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
25280 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
25290 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
252a0 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
252b0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
252c0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
252d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
252e0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
252f0 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
25300 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
25310 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
25320 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
25330 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
25340 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
25350 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
25360 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
25370 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
25380 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
25390 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
253a0 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
253b0 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
253c0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
253d0 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
253e0 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
253f0 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
25400 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
25410 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
25420 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
25430 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
25440 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
25450 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
25460 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
25470 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
25480 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
25490 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
254a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
254b0 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
254c0 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
254d0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
254e0 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
254f0 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
25500 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
25510 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
25520 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
25530 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
25540 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
25550 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
25560 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
25570 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
25580 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
25590 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
255a0 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
255b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
255c0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
255d0 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
255e0 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
255f0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
25600 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
25610 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
25620 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
25630 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
25640 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
25650 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
25660 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
25670 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
25680 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
25690 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
256a0 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
256b0 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
256c0 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
256d0 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
256e0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
256f0 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
25700 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
25710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
25720 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
25730 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
25740 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
25750 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
25760 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25770 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
25780 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
25790 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
257a0 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
257b0 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
257c0 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
257d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
257e0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
257f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
25800 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
25810 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
25820 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
25830 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
25840 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
25850 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
25860 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
25870 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
25880 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
25890 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
258a0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
258b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
258c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
258d0 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
258e0 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
258f0 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
25900 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
25910 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
25920 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
25930 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
25940 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
25950 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
25960 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
25970 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
25980 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
25990 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
259a0 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
259b0 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
259c0 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
259d0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
259e0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
259f0 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
25a00 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
25a10 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
25a20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
25a30 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
25a40 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
25a50 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
25a60 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
25a70 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
25a80 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
25a90 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
25aa0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
25ab0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
25ac0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
25ad0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
25b00 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
25b10 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
25b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25b30 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
25b40 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e   char *zShmFilen
25b50 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
25b60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
25b70 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48  file used for SH
25b80 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46  M */.  int nShmF
25b90 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
25ba0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25bb0 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61  f the SHM filena
25bc0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
25bd0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
25be0 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
25bf0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20  unixShm object. 
25c00 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
25c10 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
25c20 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
25c30 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
25c40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
25c50 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
25c60 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p));.  assert( p
25c70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
25c80 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
25c90 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d  see if a unixShm
25ca0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65  Node object alre
25cb0 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73  ady exists. Reus
25cc0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  e an existing.  
25cd0 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e  ** one if presen
25ce0 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  t. Create a new 
25cf0 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
25d00 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
25d10 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
25d20 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
25d30 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  ode;.  pShmNode 
25d40 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  = pInode->pShmNo
25d50 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  de;.  if( pShmNo
25d60 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  de==0 ){.    str
25d70 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20  /* fstat() info 
25da0 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
25db0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  e */..    /* Cal
25dc0 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67  l fstat() to fig
25dd0 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d  ure out the perm
25de0 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64  issions on the d
25df0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25e00 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d  .    ** a new *-
25e10 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61  shm file is crea
25e20 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ted, an attempt 
25e30 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
25e40 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  create it.    **
25e50 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
25e60 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65 20  ermissions. The 
25e70 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73 69 6f  actual permissio
25e80 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ns the file is c
25e90 72 65 61 74 65 64 0a 20 20 20 20 2a 2a 20 77 69  reated.    ** wi
25ea0 74 68 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  th are subject t
25eb0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 6d  o the current um
25ec0 61 73 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  ask setting..   
25ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
25ee0 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
25ef0 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d  Stat) && pInode-
25f00 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
25f10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25f20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
25f30 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
25f40 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
25f50 7d 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  }..    const cha
25f60 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70  r *zBasePath = p
25f70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 69 66  DbFd->zPath;.#if
25f80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25f90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
25fa0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25fb0 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 70 44 62  LE.    /* If pDb
25fc0 46 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  Fd is configured
25fd0 20 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b   with proxy lock
25fe0 69 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74 68  ing mode, use th
25ff0 65 20 6c 6f 63 61 6c 20 0a 20 20 20 20 20 2a 2a  e local .     **
26000 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
26010 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
26020 20 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a   -shm file path.
26030 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20       */.    if( 
26040 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
26050 64 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20  de(pDbFd) ){.   
26060 20 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70     zBasePath = p
26070 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79  roxySharedMemory
26080 42 61 73 65 50 61 74 68 28 70 44 62 46 64 29 3b  BasePath(pDbFd);
26090 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 61 73  .      if( !zBas
260a0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  ePath ){.       
260b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
260c0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
260d0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
260e0 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  n_err;.      }. 
260f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
26110 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
26120 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
26130 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
26140 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
26150 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
26160 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
26170 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73  (int)strlen(zBas
26180 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ePath);.#endif. 
26190 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
261a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
261b0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
261c0 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29  + nShmFilename )
261d0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
261e0 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
261f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26200 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
26210 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
26220 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
26230 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
26240 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46  *pShmNode)+nShmF
26250 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53  ilename);.    zS
26260 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
26270 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
26280 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
26290 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
262a0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
262b0 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
262c0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
262d0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
262e0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
262f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
26300 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
26310 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
26320 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
26330 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
26340 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
26350 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
26360 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
26370 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
26380 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
26390 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
263a0 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20  , zBasePath);.  
263b0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
263c0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
263d0 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
263e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
263f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
26400 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
26410 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
26420 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
26430 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
26440 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
26450 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
26460 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
26470 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
26480 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
26490 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
264a0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
264b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
264c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
264d0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
264e0 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
264f0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
26500 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
26510 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
26520 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20  R | O_CREAT;.   
26530 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
26540 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64  ri_boolean(pDbFd
26550 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
26560 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20  ly_shm", 0) ){. 
26570 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
26580 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
26590 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
265a0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
265b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
265c0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
265d0 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
265e0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
265f0 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
26600 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
26610 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
26620 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
26630 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
26640 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
26650 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
26660 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
26670 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
26680 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  rr;.      }.  . 
26690 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
266a0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
266b0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
266c0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
266d0 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
266e0 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
266f0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
26700 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
26710 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
26720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26730 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
26740 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
26750 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
26760 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
26770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26780 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
26790 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
267a0 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
267b0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
267c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
267d0 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
267e0 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
267f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
26800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26810 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 61 73  /* If running as
26820 20 72 6f 6f 74 20 73 65 74 20 74 68 65 20 75 69   root set the ui
26830 64 2f 67 69 64 20 6f 66 20 74 68 65 20 73 68 6d  d/gid of the shm
26840 20 66 69 6c 65 20 74 6f 20 6d 61 74 63 68 20 74   file to match t
26850 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
26860 20 20 20 20 20 20 20 20 20 75 69 64 5f 74 20 65           uid_t e
26870 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b  uid = geteuid();
26880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
26890 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21  uid==0 && (euid!
268a0 3d 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c  =sStat.st_uid ||
268b0 20 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61   getegid()!=sSta
268c0 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20  t.st_gid) ){.   
268d0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68           if( fch
268e0 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  own(pShmNode->h,
268f0 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73   sStat.st_uid, s
26900 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a  Stat.st_gid) ){.
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
26920 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26930 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  SHMOPEN;.       
26940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26950 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26980 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
26990 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
269a0 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
269b0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
269c0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
269d0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
269e0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
269f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
26a00 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
26a10 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
26a20 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
26a30 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
26a40 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
26a50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26a60 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
26a70 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
26a80 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
26a90 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
26aa0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
26ab0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
26ac0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
26ad0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
26ae0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
26af0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
26b00 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
26b10 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
26b20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
26b30 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
26b40 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
26b50 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
26b60 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
26b70 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
26b80 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
26b90 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
26ba0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
26bb0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
26bc0 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
26bd0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
26be0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
26bf0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
26c00 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
26c10 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
26c20 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
26c30 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
26c40 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26c50 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
26c60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26c70 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
26c80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
26c90 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26ca0 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
26cb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
26cc0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
26cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ce0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
26cf0 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
26d00 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
26d10 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
26d20 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
26d30 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
26d40 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
26d50 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
26d60 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
26d70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
26d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26d90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26da0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
26db0 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
26dc0 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
26dd0 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
26de0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
26df0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
26e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
26e10 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
26e20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
26e30 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
26e40 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
26e50 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
26e60 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
26e70 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
26e80 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
26e90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
26ea0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
26eb0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
26ec0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
26ed0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
26ee0 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
26ef0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
26f00 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
26f10 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
26f20 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
26f30 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
26f40 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
26f50 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
26f60 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
26f70 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
26f80 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
26f90 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
26fa0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
26fb0 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
26fc0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
26fd0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
26fe0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
26ff0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
27000 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
27010 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
27020 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
27030 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
27040 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
27050 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
27060 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
27070 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
27080 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
27090 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
270a0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
270b0 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
270c0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
270d0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
270e0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
270f0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
27100 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
27110 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
27120 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
27130 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
27140 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
27150 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
27160 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
27170 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
27180 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
27190 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
271a0 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
271c0 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
271d0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
271e0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
271f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27200 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
27210 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
27240 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
27250 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
27260 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
27270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27280 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
27290 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
272a0 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
272b0 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
272c0 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
272d0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
272e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
272f0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
27300 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
27310 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
27320 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
27330 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
27340 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
27350 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
27360 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
27370 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
27380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27390 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
273a0 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
273b0 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
273c0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
273d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
273e0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
273f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
27400 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
27410 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
27420 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
27430 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
27440 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
27450 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
27460 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
27470 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
27480 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
27490 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
274a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
274b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
274c0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
274d0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
274e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
274f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
27500 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
27510 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
27540 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
27550 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
27560 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
27570 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
27580 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
27590 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
275a0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
275b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
275c0 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
275d0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
275e0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
275f0 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
27600 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
27610 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
27620 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
27630 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
27640 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
27650 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
27660 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
27670 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
27680 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
27690 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
276a0 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
276b0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
276c0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
276d0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
276e0 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  n)..      */.   
276f0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
27700 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
27710 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  at) ){.        r
27720 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
27730 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20  _SHMSIZE;.      
27740 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
27750 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ut;.      }.  . 
27760 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73       if( sStat.s
27770 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a  t_size<nByte ){.
27780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
27790 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
277a0 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
277b0 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
277c0 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
277d0 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78      ** false, ex
277e0 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
277f0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
27800 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
27810 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
27820 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27830 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
27840 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
27850 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  e, use ftruncate
27860 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
27870 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
27880 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
27890 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  egion..        *
278a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
278b0 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68  Extend ) goto sh
278c0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
278d0 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
278e0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
278f0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
27900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
27910 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
27920 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
27930 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20   "ftruncate",.  
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
27960 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
27970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
27980 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
27990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
279a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
279b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
279c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
279d0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
279e0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
279f0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
27a00 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
27a10 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
27a20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
27a30 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
27a40 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
27a50 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
27a60 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
27a70 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27a80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
27a90 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
27aa0 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
27ab0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
27ac0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
27ad0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
27ae0 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
27af0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
27b00 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
27b10 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
27b20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c    pMem = mmap(0,
27b30 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20   szRegion,.     
27b40 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
27b50 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
27b60 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
27b70 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
27b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
27b90 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
27ba0 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  e->h, pShmNode->
27bb0 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
27bc0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27bd0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
27be0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
27bf0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
27c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
27c10 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
27c20 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
27c30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
27c40 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27c50 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
27c60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27c70 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
27c80 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65  ite3_malloc(szRe
27c90 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
27ca0 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
27cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27cc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
27cd0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27ce0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
27cf0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
27d00 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
27d10 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
27d20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
27d30 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
27d40 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a  Region] = pMem;.
27d50 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27d60 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
27d70 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
27d80 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
27d90 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
27da0 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  on ){.    *pp = 
27db0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
27dc0 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  on[iRegion];.  }
27dd0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
27de0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  0;.  }.  if( pSh
27df0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
27e00 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  y && rc==SQLITE_
27e10 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
27e20 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c  _READONLY;.  sql
27e30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
27e40 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
27e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27e60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
27e70 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
27e80 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
27e90 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  ry segment..**.*
27ea0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
27eb0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
27ec0 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20  ween SHAREd and 
27ed0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
27ee0 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64  is a little.** d
27ef0 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68  ifferent here th
27f00 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e  an in posix.  In
27f10 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65   xShmLock(), one
27f20 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c   can go from unl
27f30 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72  ocked.** to shar
27f40 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66  ed and back or f
27f50 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
27f60 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61  exclusive and ba
27f70 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79  ck.  But one may
27f80 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20  .** not go from 
27f90 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73  shared to exclus
27fa0 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c  ive or from excl
27fb0 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e  usive to shared.
27fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27fd0 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  nixShmLock(.  sq
27fe0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
27ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
28000 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
28010 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
28020 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
28030 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
28040 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
28050 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
28060 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
28070 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
28080 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28090 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
280a0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
280b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
280e0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
280f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
28100 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
28110 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  *)fd;      /* Co
28120 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
28130 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
28140 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  /.  unixShm *p =
28150 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
28160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28170 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
28180 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
28190 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
281c0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
281d0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69  iblings */.  uni
281e0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
281f0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
28200 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  ;  /* The underl
28210 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20  ying file iNode 
28220 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28230 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
28250 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
28260 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
28290 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
282a0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
282b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
282c0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
282d0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
282e0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
282f0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
28300 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
28310 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
28320 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
28330 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
28340 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
28350 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
28360 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
28370 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
28380 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
28390 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
283a0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
283b0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
283c0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
283d0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
283e0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
283f0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
28400 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
28410 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
28420 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
28430 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
28440 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
28450 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
28460 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73  SIVE)!=0 );.  as
28470 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
28480 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
28490 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
284a0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
284b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
284c0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
284d0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
284e0 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  ==0 );..  mask =
284f0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
28500 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
28510 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
28520 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
28530 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28540 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
28550 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
28560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
28570 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
28580 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
28590 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
285a0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
285b0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
285c0 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
285d0 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
285e0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
285f0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28600 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28610 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28620 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
28630 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
28640 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28650 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
28660 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
28670 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
28680 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
28690 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
286a0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
286b0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
286c0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
286d0 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
286e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
286f0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
28700 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c  (pShmNode, F_UNL
28710 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
28720 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
28730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
28750 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
28760 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
28770 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28790 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
287a0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
287b0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
287c0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
287d0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
287e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
287f0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
28800 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
28810 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
28820 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
28830 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
28840 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
28850 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
28860 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
28870 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
28880 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
28890 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
288a0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
288b0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
288c0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
288d0 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
288e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
288f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
28900 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
28910 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
28920 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28930 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
28940 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
28950 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28960 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
28970 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28980 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
28990 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
289a0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
289b0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
289c0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
289d0 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
289e0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
289f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28a00 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
28a10 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
28a20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28a30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28a40 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
28a50 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
28a60 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
28a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28aa0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
28ab0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
28ac0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
28ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28ae0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
28af0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
28b00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
28b10 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
28b20 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
28b30 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
28b40 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
28b50 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
28b60 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
28b70 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
28b80 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
28b90 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28ba0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
28bb0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
28bc0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
28bd0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
28be0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
28bf0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
28c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
28c10 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
28c20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
28c40 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
28c50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
28c60 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
28c70 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
28c80 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
28c90 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
28ca0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
28cb0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
28cc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
28cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28ce0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
28cf0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
28d00 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  Node, F_WRLCK, o
28d10 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
28d20 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
28d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28d40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28d50 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
28d60 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
28d70 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
28d80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
28d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28da0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
28db0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
28dc0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
28dd0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
28de0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
28df0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
28e00 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
28e10 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  getpid(), p->sha
28e20 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
28e30 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
28e40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
28e50 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
28e60 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
28e70 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
28e80 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
28e90 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
28ea0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
28eb0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
28ec0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
28ed0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
28ee0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
28ef0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
28f00 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
28f10 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
28f20 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
28f30 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
28f40 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28f50 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
28f60 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
28f70 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
28f80 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
28f90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
28fa0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
28fb0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
28fc0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
28fd0 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
28fe0 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
28ff0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
29000 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
29010 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
29020 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
29030 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
29040 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29050 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
29060 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
29070 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
29080 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
29090 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
290a0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
290b0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
290c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
290d0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
290e0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
290f0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29110 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
29120 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
29130 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
29160 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
29170 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
29180 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
29190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
291a0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
291b0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
291c0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
291f0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
29200 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
29210 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
29240 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
29250 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
29260 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
29270 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
29280 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
29290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
292a0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
292b0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
292c0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
292d0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
292e0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
292f0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
29300 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
29310 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
29320 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
29330 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
29340 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
29350 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
29360 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
29370 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
29380 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
29390 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
293a0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
293b0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
293c0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
293d0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
293e0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
293f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
29400 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
29410 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
29420 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
29430 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
29440 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
29450 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
29460 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
29470 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
29480 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
29490 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
294a0 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
294b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
294c0 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
294d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
294e0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
294f0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
29500 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
29510 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
29520 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
29530 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e  ->h>=0 ) osUnlin
29540 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
29550 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78  ename);.    unix
29560 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
29570 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
29580 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
29590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
295a0 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
295b0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
295c0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
295d0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
295e0 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
295f0 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
29600 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
29610 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
29620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
29630 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
29640 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
29650 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
29660 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
29670 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
29680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
29690 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
296a0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
296b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
296d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29710 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
29720 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
29730 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
29740 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
29750 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
29760 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
29770 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
29780 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
29790 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
297a0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
297b0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
297c0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
297d0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
297e0 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
297f0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
29800 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
29810 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
29820 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
29830 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
29840 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
29850 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
29860 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
29870 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
29880 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
29890 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
298a0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
298b0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
298c0 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
298d0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
298e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
298f0 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
29900 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
29910 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
29920 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
29930 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
29940 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
29950 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
29960 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
29970 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
29980 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
29990 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
299a0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
299b0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
299c0 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
299d0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
299e0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
299f0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
29a00 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
29a10 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
29a20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
29a30 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
29a40 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
29a50 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
29a60 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
29a70 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
29a80 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
29a90 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
29aa0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
29ab0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
29ac0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
29ad0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
29ae0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
29af0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
29b00 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
29b10 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
29b20 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
29b30 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
29b40 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
29b50 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
29b60 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
29b70 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
29b80 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
29b90 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
29ba0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
29bb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29bc0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
29bd0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
29be0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
29bf0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
29c00 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
29c10 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
29c20 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
29c30 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
29c40 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
29c50 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
29c60 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
29c70 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
29c80 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
29c90 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
29ca0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
29cb0 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
29cc0 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
29cd0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
29ce0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
29cf0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29d00 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
29d10 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
29d40 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
29d50 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
29d60 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
29db0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
29de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29df0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
29e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29e40 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
29e80 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
29e90 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
29ea0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29f10 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
29f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29f30 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29f60 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f80 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29fb0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29fd0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a000 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a020 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2a030 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
2a040 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a050 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
2a060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a070 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2a0a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
2a0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a0c0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a0f0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
2a100 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
2a110 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
2a120 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a130 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2a140 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  xShmMap,        
2a150 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2a160 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a190 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
2a1a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
2a1b0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2a1e0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
2a1f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
2a200 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
2a230 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20  mUnmap          
2a240 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
2a250 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2c0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
2a2d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a2e0 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
2a2f0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
2a300 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
2a310 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
2a320 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
2a330 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
2a370 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
2a380 20 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 20 20 20 20 20 20                  
2a3b0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a400 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a410 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a420 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
2a430 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2a440 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
2a450 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
2a460 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
2a470 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
2a480 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a490 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
2a4a0 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
2a4b0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
2a4c0 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
2a4d0 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
2a4e0 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
2a4f0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
2a500 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
2a510 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
2a520 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2a530 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a540 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
2a550 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
2a560 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a570 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a580 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32  ject name */.  2
2a590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a5b0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61  ed memory is ena
2a5c0 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
2a5d0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a5e0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2a5f0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2a600 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a610 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2a620 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
2a630 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a640 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2a650 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2a660 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2a670 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2a680 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2a690 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
2a6a0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
2a6b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
2a6c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a6d0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
2a6e0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2a6f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a700 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a710 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a730 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a740 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a750 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  d */.  nolockClo
2a760 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a770 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a780 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
2a790 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a7a0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a7b0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
2a7c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a7d0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a7e0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
2a7f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
2a800 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a810 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a820 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2a830 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
2a840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a850 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a860 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
2a870 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a880 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a890 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a8a0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a8d0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a8e0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
2a8f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a900 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a910 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a930 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a940 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
2a950 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a960 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a970 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
2a980 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a  ReservedLock  /*
2a990 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2a9a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
2a9b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2a9c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a9d0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
2a9e0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
2a9f0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2aa00 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2aa10 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2aa20 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
2aa30 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2aa40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2aa50 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2aa60 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa80 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2aa90 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2aaa0 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
2aab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2aac0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2aad0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
2aae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2aaf0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ab00 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
2ab10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2ab20 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2ab30 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
2ab40 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
2ab50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2ab60 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2ab70 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
2ab80 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
2ab90 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
2aba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2abb0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2abc0 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
2abd0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2abe0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2abf0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2ac00 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2ac30 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2ac40 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac60 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2ac70 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac90 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2aca0 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acc0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2acd0 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
2ace0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
2acf0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2ad00 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
2ad10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2ad20 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2ad30 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2ad40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2ad50 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
2ad60 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2ad70 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2ad80 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2ad90 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2adb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2adc0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2add0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2adf0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2ae00 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2ae10 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
2ae20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2ae30 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2ae40 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
2ae50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2ae60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2ae70 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
2ae80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2ae90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2aea0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
2aeb0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
2aec0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2aed0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2aee0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
2aef0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
2af00 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
2af10 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
2af20 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
2af30 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
2af40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2af50 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
2af60 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
2af70 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
2af80 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
2af90 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
2afa0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
2afb0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
2afc0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
2afd0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
2afe0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
2aff0 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
2b000 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
2b010 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
2b020 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
2b030 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
2b040 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
2b050 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
2b060 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b070 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
2b080 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
2b090 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
2b0a0 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
2b0b0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
2b0c0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
2b0d0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b0e0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b0f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b100 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
2b110 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
2b120 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
2b130 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
2b140 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2b150 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2b160 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
2b170 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
2b180 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2b190 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b1a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2b1b0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
2b1c0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
2b1d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2b1e0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2b1f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
2b200 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2b210 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2b220 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2b230 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20  t name */.  2,  
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2b260 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65  memory is enable
2b270 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
2b280 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2b290 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2b2a0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
2b2b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b2c0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2b2d0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
2b2e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2b2f0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2b300 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
2b310 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
2b320 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2b330 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2b340 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
2b350 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
2b360 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
2b370 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
2b380 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
2b390 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
2b3a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b3b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b3c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b3d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
2b3e0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b3f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b400 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b410 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
2b420 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b430 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2b440 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2b450 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2b480 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2b490 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4b0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2b4c0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4e0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2b4f0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b510 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2b520 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2b530 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
2b540 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2b550 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2b560 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2b570 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2b580 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2b590 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b5a0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2b5b0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2b5c0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2b5d0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2b5e0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2b5f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2b600 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2b610 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2b620 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2b630 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2b640 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2b650 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2b660 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2b670 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2b680 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2b690 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b6a0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2b6b0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2b6c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2b6d0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2b6e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2b6f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2b700 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2b710 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2b720 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2b730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b740 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2b750 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2b760 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2b770 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2b780 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b790 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2b7a0 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2b7b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b7c0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2b7d0 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2b7e0 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2b7f0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2b800 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2b810 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2b820 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2b830 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2b840 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2b850 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2b860 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2b870 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2b880 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2b890 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2b8a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2b8b0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2b8c0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2b8d0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2b8e0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2b8f0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2b900 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2b910 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2b920 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2b930 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2b940 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2b950 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2b960 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2b970 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2b980 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2b990 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b9a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2b9b0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2b9c0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2b9d0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2b9e0 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2b9f0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2ba00 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2ba10 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2ba20 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2ba30 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2ba40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2ba50 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2ba60 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2ba70 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2ba80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2ba90 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2baa0 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2bab0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2bac0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2bad0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2bae0 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2baf0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2bb00 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2bb10 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2bb20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2bb30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2bb40 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2bb50 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2bb60 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2bb70 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2bb80 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2bb90 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2bba0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2bbb0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2bbc0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2bbd0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2bbe0 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2bbf0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2bc00 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2bc10 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2bc20 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2bc30 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2bc40 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2bc50 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2bc60 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2bc70 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2bc80 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2bc90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2bca0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2bcb0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2bcc0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2bcd0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2bce0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2bcf0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2bd00 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2bd10 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2bd20 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2bd30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2bd40 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2bd50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bd60 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2bd70 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
2bd80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2bd90 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2bda0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2bdb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2bdc0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2bdd0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2bde0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2bdf0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2be00 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2be10 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2be20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2be30 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2be40 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2be50 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2be60 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
2be70 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
2be80 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2be90 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2bea0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2beb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2bec0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2bed0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2bee0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2bef0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2bf00 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
2bf10 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
2bf20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
2bf30 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2bf40 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2bf50 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2bf60 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2bf70 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2bf80 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2bf90 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2bfa0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2bfb0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2bfc0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2bfd0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2bfe0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
2bff0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
2c000 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
2c010 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
2c020 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
2c030 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
2c040 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
2c050 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
2c060 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2c070 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2c080 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2c090 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2c0a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2c0b0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2c0c0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2c0d0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2c0e0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2c0f0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2c100 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
2c110 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
2c120 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2c130 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
2c140 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
2c150 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2c160 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
2c170 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
2c180 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2c190 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
2c1a0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2c1b0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
2c1c0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
2c1d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c1e0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
2c1f0 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2c200 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2c210 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
2c220 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
2c230 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
2c240 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2c250 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
2c260 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
2c270 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
2c280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2c2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
2c2f0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2c300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2c320 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
2c330 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
2c340 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
2c350 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
2c360 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
2c370 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
2c380 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
2c390 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
2c3a0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2c3b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
2c3c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c3d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2c3e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2c3f0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
2c400 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
2c410 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
2c440 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
2c450 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
2c460 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2c470 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72  *pId,      /* Wr
2c480 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46  ite to the unixF
2c490 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
2c4a0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
2c4b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
2c4c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
2c4d0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2c4e0 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
2c4f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
2c500 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e   Zero or more UN
2c510 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20  IXFILE_* values 
2c520 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71  */.){.  const sq
2c530 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c540 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   *pLockingStyle;
2c550 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2c560 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
2c570 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pId;.  int rc = 
2c580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2c590 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f  sert( pNew->pIno
2c5a0 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f  de==NULL );..  /
2c5b0 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61  * Usually the pa
2c5c0 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f  th zFilename sho
2c5d0 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c  uld not be a rel
2c5e0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
2c5f0 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69  The.  ** excepti
2c600 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69  on is when openi
2c610 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f  ng the proxy "co
2c620 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69  nch" file in bui
2c630 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e  lds that.  ** in
2c640 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61  clude the specia
2c650 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20  l Apple locking 
2c660 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66  styles..  */.#if
2c670 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c680 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2c690 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c6a0 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  LE.  assert( zFi
2c6b0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
2c6c0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a  lename[0]=='/' .
2c6d0 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70      || pVfs->pAp
2c6e0 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61  pData==(void*)&a
2c6f0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
2c700 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72  );.#else.  asser
2c710 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
2c720 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
2c730 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ='/' );.#endif..
2c740 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20    /* No locking 
2c750 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72  occurs in tempor
2c760 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61  ary files */.  a
2c770 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2c780 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67  !=0 || (ctrlFlag
2c790 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
2c7a0 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53  OCK)!=0 );..  OS
2c7b0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
2c7c0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
2c7d0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
2c7e0 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
2c7f0 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  w->pVfs = pVfs;.
2c800 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20    pNew->zPath = 
2c810 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65  zFilename;.  pNe
2c820 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  w->ctrlFlags = (
2c830 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  u8)ctrlFlags;.  
2c840 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
2c850 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
2c860 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
2c870 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
2c880 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
2c8b0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2c8c0 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
2c8d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2c8e0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
2c8f0 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70  }.  if( memcmp(p
2c900 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2c910 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b  -excl",10)==0 ){
2c920 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c930 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c940 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20  _EXCL;.  }..#if 
2c950 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
2c960 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
2c970 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
2c980 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
2c990 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
2c9a0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2c9b0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2c9c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c9d0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
2c9e0 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67  ..  if( ctrlFlag
2c9f0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
2ca00 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  OCK ){.    pLock
2ca10 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
2ca20 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2ca30 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
2ca40 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
2ca50 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
2ca60 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
2ca70 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66  name, pNew);.#if
2ca80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2ca90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2caa0 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
2cab0 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
2cac0 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
2cad0 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
2cae0 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
2caf0 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
2cb00 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
2cb10 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
2cb20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
2cb30 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
2cb40 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
2cb50 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
2cb60 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
2cb70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
2cb80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2cb90 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
2cba0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
2cbb0 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
2cbc0 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
2cbd0 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69  Methods.#if defi
2cbe0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2cbf0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2cc00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2cc10 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79    || pLockingSty
2cc20 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68  le == &nfsIoMeth
2cc30 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ods.#endif.  ){.
2cc40 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2cc50 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2cc60 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2cc70 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2cc80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cc90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cca0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2ccb0 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64   occured in find
2ccc0 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2ccd0 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2cce0 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2ccf0 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2cd00 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2cd10 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2cd20 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2cd30 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2cd40 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2cd50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2cd60 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2cd70 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2cd80 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2cd90 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2cda0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cdb0 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2cdc0 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2cdd0 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2cde0 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2cdf0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2ce00 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2ce10 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2ce20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2ce30 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2ce40 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2ce50 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2ce60 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2ce70 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2ce80 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2ce90 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2cea0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2ceb0 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2cec0 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2ced0 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2cee0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2cef0 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2cf00 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2cf10 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2cf20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2cf30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2cf40 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2cf50 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2cf60 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2cf70 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2cf80 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2cf90 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2cfa0 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2cfb0 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2cfc0 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2cfd0 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2cfe0 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2cff0 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2d000 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2d010 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2d020 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2d030 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d040 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2d050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2d060 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2d070 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2d080 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d090 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2d0a0 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2d0b0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2d0c0 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2d0d0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2d0e0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d0f0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d100 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2d110 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2d120 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2d130 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2d140 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2d150 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2d160 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d170 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2d180 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2d190 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2d1a0 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
2d1b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2d1c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2d1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2d1e0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2d1f0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2d200 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2d210 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2d220 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2d230 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2d240 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2d250 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2d260 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2d270 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2d280 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2d290 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2d2a0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2d2b0 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2d2c0 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2d2d0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2d2e0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d2f0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2d300 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2d310 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2d320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d350 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2d360 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2d370 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2d380 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2d390 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2d3a0 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2d3b0 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2d3c0 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2d3d0 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2d3e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d3f0 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2d400 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2d410 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2d420 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2d430 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2d440 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2d450 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2d460 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2d470 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2d480 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2d490 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2d4a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
2d4b0 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
2d4c0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2d4d0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2d4e0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2d4f0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2d500 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2d510 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2d520 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2d530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2d540 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2d560 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2d570 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
2d580 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
2d590 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
2d5a0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2d5b0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d5c0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
2d5d0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2d5e0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
2d5f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2d600 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
2d610 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
2d620 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2d630 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2d640 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2d650 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
2d660 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
2d670 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
2d680 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
2d690 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2d6a0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2d6b0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2d6c0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2d6d0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
2d6e0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
2d6f0 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
2d700 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2d710 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
2d720 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2d730 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
2d740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d750 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
2d760 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
2d770 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d790 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
2d7a0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
2d7b0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
2d7c0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
2d7d0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
2d7e0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
2d7f0 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
2d800 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2d810 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
2d820 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
2d830 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
2d840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2d850 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2d860 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
2d870 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d880 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2d890 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2d8a0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2d8b0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2d8c0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2d8d0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2d8e0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
2d8f0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
2d900 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2d910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d920 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2d930 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2d940 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d950 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2d960 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2d970 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
2d980 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
2d990 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
2d9a0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2d9b0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2d9c0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  TE;.#endif.  if(
2d9d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d9e0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2d9f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2da00 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2da10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2da20 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
2da30 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2da40 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
2da50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2da60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2da70 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2da80 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2da90 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2daa0 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2dab0 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2dac0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2dad0 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2dae0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2daf0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2db00 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2db10 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2db20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2db30 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2db40 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2db50 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
2db60 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
2db70 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
2db80 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
2db90 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
2dba0 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
2dbb0 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
2dbc0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2dbd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2dbe0 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
2dbf0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
2dc00 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
2dc10 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
2dc20 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
2dc30 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2dc40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2dc50 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2dc60 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
2dc70 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
2dc80 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2dc90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dca0 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
2dcb0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
2dcc0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
2dcd0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2dce0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2dcf0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
2dd00 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
2dd10 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
2dd20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
2dd30 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
2dd40 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
2dd50 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
2dd60 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
2dd70 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
2dd80 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
2dd90 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
2dda0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
2ddb0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
2ddc0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2ddd0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2dde0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
2ddf0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
2de00 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2de10 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2de20 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
2de30 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
2de40 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2de50 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
2de60 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2de70 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2de80 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
2de90 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
2dea0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2deb0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2dec0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2ded0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2dee0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2def0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2df00 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2df10 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2df20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2df30 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2df40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2df50 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
2df60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2df70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2df80 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2df90 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2dfa0 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2dfb0 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2dfc0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2dfd0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2dfe0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2dff0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2e000 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2e010 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2e020 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2e030 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2e040 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2e050 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2e060 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2e070 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65  ) + 18) >= (size
2e080 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2e090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2e0a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2e0b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2e0c0 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
2e0d0 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2e0e0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2e0f0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2e100 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2e110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2e120 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2e130 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2e140 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2e150 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2e160 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2e170 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2e180 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2e190 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2e1a0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2e1b0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  uf[j] = 0;.    z
2e1c0 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
2e1d0 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2e1e0 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2e1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e200 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2e210 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e220 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2e230 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2e240 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2e250 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2e260 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2e270 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2e280 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2e290 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2e2a0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2e2b0 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2e2c0 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2e2d0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2e2e0 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2e2f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2e300 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2e310 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2e320 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2e330 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2e340 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2e350 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2e360 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2e370 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2e380 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2e390 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2e3a0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2e3b0 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2e3c0 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2e3d0 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2e3e0 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2e3f0 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2e400 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2e410 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2e420 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2e430 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2e440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2e450 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2e460 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2e470 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2e480 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2e490 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2e4a0 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2e4b0 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2e4c0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2e4d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2e4e0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2e4f0 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2e500 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2e510 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2e520 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2e530 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2e540 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2e550 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2e560 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2e570 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2e580 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2e590 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2e5a0 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2e5b0 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2e5c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2e5d0 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2e5e0 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2e5f0 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2e600 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2e610 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2e620 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2e630 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2e640 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2e650 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2e660 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2e670 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2e680 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2e690 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2e6a0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2e6b0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2e6c0 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2e6d0 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2e6e0 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2e6f0 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2e700 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2e710 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2e720 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2e730 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2e740 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2e750 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2e760 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2e770 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2e780 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2e790 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2e7a0 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2e7b0 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2e7c0 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2e7d0 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2e7e0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2e7f0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2e800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e810 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2e820 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2e830 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2e840 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2e850 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2e860 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2e870 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2e880 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2e890 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2e8a0 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2e8b0 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2e8c0 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2e8d0 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2e8e0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2e8f0 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2e900 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2e910 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2e920 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2e930 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2e940 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2e950 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2e960 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2e970 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2e980 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2e990 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2e9a0 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2e9b0 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2e9c0 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2e9d0 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2e9e0 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2e9f0 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2ea00 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
2ea10 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
2ea20 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
2ea30 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
2ea40 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2ea50 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
2ea60 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
2ea70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2ea80 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
2ea90 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
2eaa0 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
2eab0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
2eac0 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
2eaf0 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
2eb00 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
2eb10 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
2eb20 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
2eb30 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
2eb40 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
2eb50 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
2eb60 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
2eb70 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
2eb80 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
2eb90 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
2eba0 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
2ebb0 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
2ebc0 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
2ebd0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
2ebe0 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
2ebf0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2ec00 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2ec10 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2ec20 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
2ec30 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
2ec40 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
2ec50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2ec60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2ec70 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
2ec80 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
2ec90 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
2eca0 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
2ecb0 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
2ecc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2ecd0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
2ece0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
2ecf0 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
2ed00 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
2ed10 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
2ed20 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
2ed30 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
2ed40 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
2ed50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2ed60 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2ed70 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
2ed80 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2ed90 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
2eda0 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
2edb0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 62  ** If the file b
2edc0 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2edd0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2ede0 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 63 72   it is always cr
2edf0 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  eated with.** th
2ee00 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69  e octal permissi
2ee10 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f 77  ons 0600 (read/w
2ee20 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72  ritable by owner
2ee30 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66   only). If the f
2ee40 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61  ile.** is a data
2ee50 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a  base or master j
2ee60 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20  ournal file, it 
2ee70 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
2ee80 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2ee90 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f  .** mask SQLITE_
2eea0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2eeb0 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20  MISSIONS..**.** 
2eec0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20  Finally, if the 
2eed0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2eee0 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
2eef0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2ef00 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
2ef10 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
2ef20 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
2ef30 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
2ef40 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
2ef50 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2ef60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2ef70 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
2ef80 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
2ef90 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
2efa0 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
2efb0 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
2efc0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
2efd0 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
2efe0 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
2eff0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2f000 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2f010 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2f020 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f  _8_3_NAMES optio
2f030 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2f040 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  en the.** origin
2f050 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75  al filename is u
2f060 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74  navailable.  But
2f070 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e   8_3_NAMES is on
2f080 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46  ly used for.** F
2f090 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61  AT filesystems a
2f0a0 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64  nd permissions d
2f0b0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65  o not matter the
2f0c0 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a  re, so just use.
2f0d0 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ** the default p
2f0e0 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  ermissions..*/.s
2f0f0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
2f100 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20  eateFileMode(.  
2f110 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2f120 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2f130 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20  /* Path of file 
2f140 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67  (possibly) being
2f150 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e   created */.  in
2f160 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f180 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73   Flags passed as
2f190 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
2f1a0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f   xOpen() */.  mo
2f1b0 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f1d0 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2f1e0 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77  s to open file w
2f1f0 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ith */.  uid_t *
2f200 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
2f210 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2f220 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   uid to set on t
2f230 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64  he file */.  gid
2f240 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f260 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20  OUT: gid to set 
2f270 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29  on the file */.)
2f280 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f290 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f2a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2f2b0 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d  de */.  *pMode =
2f2c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f2d0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2f2e0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2f2f0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2f300 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2f310 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2f320 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
2f330 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
2f340 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2f350 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2f360 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2f370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f380 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2f390 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20  tes in zDb */.  
2f3a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2f3b0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2f3c0 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2f3d0 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2f3e0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
2f3f0 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2f400 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2f410 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2f420 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2f430 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2f440 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2f450 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2f460 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2f470 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2f480 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2f490 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2f4a0 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2f4b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2f4c0 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2f4d0 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2f4e0 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2f4f0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f500 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2f510 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2f520 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2f530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2f540 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2f550 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2f560 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2f570 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2f580 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2f590 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2f5a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2f5b0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2f5c0 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2f5d0 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
2f5e0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2f5f0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
2f600 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  0 && sqlite3Isal
2f610 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20  num(zPath[nDb]) 
2f620 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28  ) nDb--;.    if(
2f630 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
2f640 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74  [nDb]!='-' ) ret
2f650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2f660 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
2f670 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2f680 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f690 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
2f6a0 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44  assert( zPath[nD
2f6b0 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20  b]!='\n' );.    
2f6c0 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23    nDb--;.    }.#
2f6d0 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79  endif.    memcpy
2f6e0 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
2f6f0 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
2f700 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28  = '\0';..    if(
2f710 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20   0==osStat(zDb, 
2f720 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2f730 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
2f740 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
2f750 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53        *pUid = sS
2f760 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20  tat.st_uid;.    
2f770 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e    *pGid = sStat.
2f780 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73  st_gid;.    }els
2f790 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2f7a0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2f7b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2f7c0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2f7d0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2f7e0 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
2f7f0 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a  ode = 0600;.  }.
2f800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f810 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
2f820 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
2f830 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
2f840 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
2f850 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
2f860 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
2f870 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
2f880 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
2f890 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
2f8a0 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2f8b0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
2f8c0 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2f8d0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2f8e0 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
2f8f0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
2f900 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
2f910 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
2f920 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2f930 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
2f940 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
2f950 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
2f960 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
2f970 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
2f980 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
2f990 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
2f9a0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
2f9b0 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
2f9c0 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
2f9d0 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
2f9e0 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
2f9f0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
2fa00 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
2fa10 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
2fa20 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
2fa30 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2fa40 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
2fa50 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
2fa60 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
2fa70 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
2fa80 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
2fa90 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
2faa0 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
2fab0 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
2fac0 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
2fad0 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
2fae0 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
2faf0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
2fb00 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2fb10 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2fb20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
2fb30 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
2fb40 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
2fb50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2fb60 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2fb70 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
2fb80 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
2fb90 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2fba0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
2fbb0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
2fbc0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2fbd0 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
2fbe0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc00 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
2fc10 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
2fc20 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
2fc30 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
2fc40 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2fc50 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
2fc60 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
2fc70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
2fc80 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2fc90 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
2fca0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
2fcb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2fcc0 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
2fcd0 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
2fce0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2fcf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fd00 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2fd10 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  s to open() */.#
2fd20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2fd30 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
2fd40 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2fd50 6c 61 67 73 26 30 78 46 46 30 46 46 46 30 30 3b  lags&0xFF0FFF00;
2fd60 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2fd70 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c  e to open */.#el
2fd80 73 65 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  se.  int eType =
2fd90 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
2fda0 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
2fdb0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
2fdc0 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f  endif.  int noLo
2fdd0 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2fde0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2fdf0 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2fe00 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2fe10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fe20 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2fe30 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2fe40 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
2fe50 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
2fe60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
2fe70 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
2fe80 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2fe90 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2fea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2feb0 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2fec0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2fed0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2fee0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2fef0 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2ff00 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2ff10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2ff20 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2ff30 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2ff40 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2ff50 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2ff60 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2ff70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2ff80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2ff90 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ffa0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ffb0 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2ffc0 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2ffd0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2ffe0 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
2fff0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
30000 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
30010 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30020 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
30030 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
30040 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
30050 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
30060 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
30070 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
30080 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
30090 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
300a0 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
300b0 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
300c0 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
300d0 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
300e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
300f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
30100 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
30110 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
30120 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
30130 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
30140 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
30150 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
30160 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
30170 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30180 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
30190 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
301a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
301b0 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
301c0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
301d0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
301e0 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
301f0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
30200 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
30210 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
30220 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
30230 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
30240 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
30250 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
30260 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
30270 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30280 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
30290 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
302a0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
302b0 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
302c0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
302d0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
302e0 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
302f0 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
30300 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
30310 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
30320 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
30330 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
30340 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
30350 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
30360 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
30370 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
30380 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
30390 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
303a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
303b0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
303c0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
303d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
303e0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
303f0 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
30400 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
30410 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
30420 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
30430 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
30440 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
30450 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
30460 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
30470 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
30480 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
30490 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
304a0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
304b0 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
304c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
304d0 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
304e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
304f0 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
30500 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
30510 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
30520 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30530 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
30540 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
30550 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
30560 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30570 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
30580 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
30590 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
305a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
305b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
305c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
305d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
305e0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
305f0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30600 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30610 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
30620 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
30630 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
30640 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
30650 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
30660 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
30670 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
30680 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30690 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
306a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
306b0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
306c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
306d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
306e0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
306f0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
30700 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
30710 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30720 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
30730 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30740 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
30750 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
30760 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30770 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
30780 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30790 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
307a0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
307b0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
307c0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
307d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
307e0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
307f0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
30800 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
30810 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
30820 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
30830 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
30840 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
30850 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
30860 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
30870 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
30880 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
30890 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
308a0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
308b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
308c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
308d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
308e0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
308f0 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
30900 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
30910 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
30920 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
30930 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
30940 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
30950 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
30960 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
30970 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
30980 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
30990 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
309a0 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
309b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
309c0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
309d0 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
309e0 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
309f0 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
30a00 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
30a10 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
30a20 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
30a30 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
30a40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
30a50 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
30a60 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
30a70 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  ixGetTempname(MA
30a80 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54  X_PATHNAME+2, zT
30a90 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
30aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ab0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
30ac0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
30ad0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
30ae0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
30af0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
30b00 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
30b10 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
30b20 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
30b30 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
30b40 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
30b50 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
30b60 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
30b70 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
30b80 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
30b90 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
30ba0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
30bb0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
30bc0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
30bd0 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
30be0 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
30bf0 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
30c00 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
30c10 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
30c20 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
30c30 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
30c40 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
30c50 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
30c60 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
30c70 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
30c80 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
30c90 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
30ca0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
30cb0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
30cc0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
30cd0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
30ce0 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
30cf0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
30d00 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
30d10 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
30d20 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
30d30 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
30d40 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
30d50 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
30d60 59 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  Y);..#if SQLITE_
30d70 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
30d80 45 43 54 49 4f 4e 0a 20 20 70 2d 3e 70 72 6f 74  ECTION.  p->prot
30d90 46 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  Flags = (flags &
30da0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c   SQLITE_OPEN_FIL
30db0 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
30dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  );.#endif.    . 
30dd0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30de0 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
30df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30e00 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
30e10 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
30e20 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
30e30 69 64 3b 0a 20 20 20 20 67 69 64 5f 74 20 67 69  id;.    gid_t gi
30e40 64 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  d;.    rc = find
30e50 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
30e60 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
30e70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
30e80 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
30e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ea0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
30eb0 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
30ec0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
30ed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
30ee0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
30ef0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30f00 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
30f10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30f20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
30f30 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
30f40 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
30f50 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
30f60 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
30f70 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
30f80 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
30f90 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
30fa0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
30fb0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
30fc0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
30fd0 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
30fe0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
30ff0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
31000 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
31010 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
31020 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
31030 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
31040 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
31050 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
31060 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
31070 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
31080 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
31090 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
310a0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
310b0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
310c0 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
310d0 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
310e0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
310f0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
31100 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
31110 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
31120 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
31130 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
31140 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
31150 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
31160 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
31170 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
31180 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69 6e 67  if we're opening
31190 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f 75 72   the wal or jour
311a0 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20  nal and running 
311b0 61 73 20 72 6f 6f 74 2c 20 73 65 74 20 74 68 65  as root, set the
311c0 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69 64   journal uid/gid
311d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 52   */.    if( !isR
311e0 65 61 64 6f 6e 6c 79 20 26 26 20 28 66 6c 61 67  eadonly && (flag
311f0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
31200 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
31210 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 29 20  _MAIN_JOURNAL)) 
31220 29 7b 0a 20 20 20 20 20 20 75 69 64 5f 74 20 65  ){.      uid_t e
31230 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b  uid = geteuid();
31240 0a 20 20 20 20 20 20 69 66 28 20 65 75 69 64 3d  .      if( euid=
31250 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64  =0 && (euid!=uid
31260 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67   || getegid()!=g
31270 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  id) ){.        i
31280 66 28 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69  f( fchown(fd, ui
31290 64 2c 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20  d, gid) ){.     
312a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
312b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
312c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f            goto o
312d0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
312e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
312f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
31300 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
31310 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
31320 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
31330 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
31340 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
31350 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
31360 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
31370 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
31380 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
31390 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
313a0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
313b0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
313c0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  ;.#else.    osUn
313d0 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
313e0 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
313f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
31400 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
31410 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
31420 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
31430 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
31440 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73   FD_CLOEXEC.  os
31450 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
31460 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
31470 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
31480 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
31490 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ..  noLock = eTy
314a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
314b0 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66  MAIN_DB;..  .#if
314c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
314d0 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
314e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
314f0 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73  LE.  if( fstatfs
31500 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  (fd, &fsInfo) ==
31510 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   -1 ){.    ((uni
31520 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c  xFile*)pFile)->l
31530 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
31540 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
31550 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
31560 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  __);.    return 
31570 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
31580 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
31590 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
315a0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
315b0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
315c0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
315d0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
315e0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
315f0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
31600 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
31610 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e  mp("exfat", fsIn
31620 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
31630 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
31640 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
31650 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
31660 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
31670 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  S;.  }.#endif.. 
31680 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f   /* Set up appro
31690 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73  priate ctrlFlags
316a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65   */.  if( isDele
316b0 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20  te )            
316c0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
316d0 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
316e0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
316f0 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ly )            
31700 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
31710 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
31720 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31740 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
31750 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
31760 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20  if( syncDir )   
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
31780 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
31790 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
317a0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
317b0 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
317c0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
317d0 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
317e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
317f0 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
31800 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
31810 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
31820 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
31830 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
31840 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
31850 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
31860 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
31870 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
31880 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
31890 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
318a0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
318b0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
318c0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
318d0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
318e0 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
318f0 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
31900 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
31910 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
31920 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
31930 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
31940 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
31950 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
31960 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
31970 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
31980 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
31990 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
319a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
319b0 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
319c0 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
319d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
319e0 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28  eory, the close(
319f0 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d  fd) call is sub-
31a00 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20  optimal. If the 
31a10 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20  file opened.    
31a20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69      ** with fd i
31a30 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
31a40 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
31a50 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
31a60 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  ns open.        
31a70 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ** on that file 
31a80 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
31a90 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73  ly holding advis
31aa0 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c  ory locks on it,
31ab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
31ac0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f   the call to clo
31ad0 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c  se() will cancel
31ae0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e   those locks. In
31af0 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20   practice,.     
31b00 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75     ** we're assu
31b10 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73  ming that statfs
31b20 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20  () doesn't fail 
31b30 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c  very often. At l
31b40 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  east.        ** 
31b50 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20  not while other 
31b60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
31b70 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
31b80 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20  ame process on. 
31b90 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
31ba0 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b  me file are work
31bb0 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ing.  */.       
31bc0 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20   p->lastErrno = 
31bd0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
31be0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
31bf0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31c00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31c10 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
31c20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65          goto ope
31c30 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
31c40 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f    }.      usePro
31c50 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
31c60 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
31c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31c80 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
31c90 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
31ca0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
31cb0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
31cc0 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  rlFlags);.      
31cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31ce0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
31cf0 63 61 63 68 65 20 74 68 65 20 70 4d 65 74 68 6f  cache the pMetho
31d00 64 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  d in case the tr
31d10 61 6e 73 66 6f 72 6d 20 66 61 69 6c 73 20 2a 2f  ansform fails */
31d20 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 73  .        const s
31d30 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6f  truct sqlite3_io
31d40 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
31d50 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
31d60 6f 64 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ods;.        rc 
31d70 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
31d80 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69  UnixFile((unixFi
31d90 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74  le*)pFile, ":aut
31da0 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  o:");.        if
31db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
31dd0 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f  Use unixClose to
31de0 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
31df0 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e  sources added in
31e00 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20   fillInUnixFile 
31e10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
31e20 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20  d clear all the 
31e30 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65  structure's refe
31e40 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69  rences.  Specifi
31e50 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20  cally, .        
31e60 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74    ** pFile->pMet
31e70 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c  hods will be NUL
31e80 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c  L so sqlite3OsCl
31e90 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ose will be a no
31ea0 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a  -op .          *
31eb0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
31ec0 70 4d 65 74 68 6f 64 21 3d 4e 55 4c 4c 20 29 7b  pMethod!=NULL ){
31ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
31ee0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 70 46 69  thod->xClose(pFi
31ef0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  le);.          }
31f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31f10 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
31f20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
31f30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31f40 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
31f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
31f60 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
31f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
31f80 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
31f90 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
31fa0 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74   fd, pFile, zPat
31fb0 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a  h, ctrlFlags);..
31fc0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  open_finished:. 
31fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31fe0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
31ff0 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65  3_free(p->pUnuse
32000 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
32010 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
32020 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61  elete the file a
32030 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20  t zPath. If the 
32040 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74  dirSync argument
32050 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28   is true, fsync(
32060 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  ).** the directo
32070 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
32080 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  g the file..*/.s
32090 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
320a0 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
320b0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
320c0 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e    /* VFS contain
320d0 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20  ing this as the 
320e0 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a  xDelete method *
320f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
32100 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  zPath,        /*
32110 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
32120 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20   be deleted */. 
32130 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20   int dirSync    
32140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
32150 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64   true, fsync() d
32160 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
32170 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a  eleting file */.
32180 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45  LITE_OK;.  UNUSE
321a0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
321b0 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
321c0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
321d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
321e0 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c  TE);.  if( osUnl
321f0 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29  ink(zPath)==(-1)
32200 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e   && errno!=ENOEN
32210 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
32220 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
32230 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
32240 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74  , "unlink", zPat
32250 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  h);.  }.#ifndef 
32260 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
32270 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69  IRSYNC.  if( (di
32280 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b  rSync & 1)!=0 ){
32290 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
322a0 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
322b0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
322c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
322d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
322e0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
322f0 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
32300 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
32310 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
32320 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
32330 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
32340 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
32350 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
32360 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
32370 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 4f  );.      }.#if O
32380 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
32390 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69  SE_IOERR.      i
323a0 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72  f( close(fd)&&!r
323b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
323c0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
323d0 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
323e0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
323f0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
32400 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e  , __LINE__);.#en
32410 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
32420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
32430 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
32440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32450 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32470 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
32480 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
32490 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
324a0 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
324b0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
324c0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
324d0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
324e0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
324f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32500 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
32510 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
32520 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
32530 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32540 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32550 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
32560 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
32570 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
32580 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
32590 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
325a0 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
325b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
325c0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
325d0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
325e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
325f0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
32600 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
32610 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
32620 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32630 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32640 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
32650 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
32660 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
32670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32680 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
32690 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
326a0 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
326b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
326c0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
326d0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
326e0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
326f0 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
32700 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32710 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32720 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
32730 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
32740 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
32750 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
32760 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
32770 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
32780 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
32790 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
327a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
327b0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
327c0 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
327d0 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
327e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
327f0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
32800 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
32810 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
32820 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
32830 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
32840 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
32850 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
32860 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
32870 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74  = (osAccess(zPat
32880 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
32890 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
328a0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
328b0 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
328c0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
328d0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
328e0 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
328f0 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
32900 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
32910 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
32920 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
32930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
32940 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
32950 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
32960 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
32970 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
32980 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
32990 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
329a0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
329b0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
329c0 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
329d0 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
329e0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
329f0 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
32a00 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
32a10 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
32a20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
32a30 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
32a40 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
32a50 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
32a60 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
32a70 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
32a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
32a90 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
32aa0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
32ab0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
32ac0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
32ad0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
32ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32b00 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
32b10 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
32b20 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
32b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b40 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
32b50 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
32b60 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
32b70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
32b80 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
32b90 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
32ba0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
32bb0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
32bc0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
32bd0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
32be0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
32bf0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
32c00 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
32c10 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
32c20 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
32c30 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
32c40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
32c50 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
32c60 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
32c70 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
32c80 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
32c90 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
32ca0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
32cb0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
32cc0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
32cd0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
32ce0 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
32cf0 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
32d00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
32d10 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
32d20 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
32d30 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
32d40 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
32d50 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
32d60 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
32d70 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
32d80 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
32d90 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
32da0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
32db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
32dc0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
32dd0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
32de0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
32df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
32e00 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
32e10 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
32e20 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
32e30 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
32e40 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
32e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
32e60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
32e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32e80 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
32e90 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
32ea0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
32eb0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
32ec0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
32ed0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
32ee0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
32ef0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
32f00 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
32f10 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
32f20 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
32f30 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
32f40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32f50 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
32f60 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
32f70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32f80 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
32f90 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
32fa0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
32fb0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
32fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
32fd0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
32fe0 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
32ff0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
33000 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
33010 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
33020 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
33030 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
33040 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
33050 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
33060 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
33070 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
33080 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
33090 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
330a0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
330b0 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
330c0 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
330d0 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
330e0 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
330f0 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
33100 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
33110 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
33120 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
33130 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
33140 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
33150 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
33160 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33170 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
33180 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
33190 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
331a0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
331b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
331c0 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
331d0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
331e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
331f0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33200 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
33210 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33220 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
33230 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
33240 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
33250 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
33260 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
33270 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
33280 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
33290 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
332a0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
332b0 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
332c0 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
332d0 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
332e0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
332f0 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
33300 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
33310 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
33320 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
33330 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
33340 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
33350 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
33360 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
33370 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
33380 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
33390 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
333a0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
333b0 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
333c0 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
333d0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
333e0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
333f0 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
33400 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
33410 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
33420 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
33430 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
33440 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
33450 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
33460 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
33470 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
33480 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
33490 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
334a0 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
334b0 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
334c0 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
334d0 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
334e0 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
334f0 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
33500 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
33510 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
33520 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
33530 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
33540 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
33550 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
33560 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
33570 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
33580 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
33590 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
335a0 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
335b0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
335c0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
335d0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
335e0 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
335f0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
33600 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
33610 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
33620 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
33630 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
33640 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
33650 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
33660 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
33670 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
33680 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
33690 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
336a0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
336b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
336c0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
336d0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
336e0 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
336f0 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
33700 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33710 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
33720 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
33730 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
33740 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
33750 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
33760 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
33770 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
33780 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
33790 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
337a0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
337b0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
337c0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
337d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
337e0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
337f0 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
33800 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
33810 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
33820 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
33830 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
33840 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
33850 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
33860 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
33870 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
33880 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
33890 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
338a0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
338b0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
338c0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
338d0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
338e0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
338f0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
33900 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
33910 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
33920 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
33930 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
33940 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
33950 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
33960 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
33970 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
33980 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
33990 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
339a0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
339b0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
339c0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
339d0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
339e0 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
339f0 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
33a00 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
33a10 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
33a20 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
33a30 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
33a40 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
33a50 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
33a60 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
33a70 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
33a80 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
33a90 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
33aa0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
33ab0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
33ac0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
33ad0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
33ae0 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
33af0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
33b00 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
33b10 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
33b20 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
33b30 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
33b40 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
33b50 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
33b60 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
33b70 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
33b80 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
33b90 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
33ba0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
33bb0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
33bc0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
33bd0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
33be0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
33bf0 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
33c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c10 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
33c20 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
33c30 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
33c40 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
33c50 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
33c60 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
33c70 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
33c80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
33c90 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
33ca0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
33cb0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
33cc0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
33cd0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
33ce0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
33cf0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
33d00 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
33d10 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
33d20 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
33d30 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
33d40 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
33d50 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
33d60 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
33d70 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
33d80 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
33d90 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
33da0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
33db0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
33dc0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
33dd0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
33de0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
33df0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
33e00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
33e10 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
33e20 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
33e30 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
33e40 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
33e50 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
33e60 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
33e70 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
33e80 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
33e90 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
33ea0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
33eb0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
33ec0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
33ed0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33ee0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33ef0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
33f00 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
33f10 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
33f20 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
33f30 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
33f40 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
33f50 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33f60 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
33f70 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
33f80 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
33f90 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
33fa0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
33fb0 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
33fc0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
33fd0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33fe0 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
33ff0 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
34000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
34010 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
34020 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
34030 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
34040 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
34050 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
34060 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
34070 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
34080 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
34090 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
340a0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
340b0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
340c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
340d0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
340e0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
340f0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
34100 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
34110 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
34120 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
34130 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
34140 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
34150 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
34160 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
34170 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
34180 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
34190 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
341a0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
341b0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
341c0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
341d0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
341e0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
341f0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
34200 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
34210 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
34220 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
34230 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
34240 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
34250 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
34260 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
34270 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
34280 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
34290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
342a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
342b0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
342c0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
342d0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
342e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
342f0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
34300 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34310 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
34320 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
34330 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
34340 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
34350 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
34360 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
34370 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
34380 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
34390 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
343a0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
343b0 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
343c0 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
343d0 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
343e0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
343f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
34400 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
34410 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
34420 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
34430 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
34440 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
34450 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
34460 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
34470 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
34480 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
34490 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
344a0 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20  val sNow;.  if( 
344b0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
344c0 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ow, 0)==0 ){.   
344d0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
344e0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
344f0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
34500 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
34510 75 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c  usec/1000;.  }el
34520 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
34530 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
34540 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
34550 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
34560 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
34570 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
34580 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
34590 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
345a0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
345b0 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
345c0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
345d0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
345e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
345f0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
34600 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
34610 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
34620 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
34630 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
34640 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
34650 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
34660 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
34670 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
34680 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
34690 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
346a0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
346b0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
346c0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
346d0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
346e0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
346f0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
34700 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
34710 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
34720 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34730 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
34740 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
34750 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
34760 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
34770 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
34780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  rc;.}../*.** We 
34790 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
347a0 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
347b0 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
347c0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
347d0 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
347e0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
347f0 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
34800 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
34810 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
34820 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
34830 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
34840 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
34850 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
34860 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
34870 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
34880 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
34890 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
348a0 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
348b0 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
348c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
348d0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
348e0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
348f0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
34900 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
34910 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
34920 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34930 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34940 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
34950 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34960 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
34970 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
34980 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
34990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
349a0 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
349b0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
349c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
349d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
349e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
349f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a20 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
34a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
34a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
34a90 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
34aa0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
34ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ac0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
34ad0 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
34ae0 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
34af0 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
34b00 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
34b10 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
34b20 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
34b30 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
34b40 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
34b50 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
34b60 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
34b70 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
34b80 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
34b90 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
34ba0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
34bb0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
34bc0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
34bd0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
34be0 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
34bf0 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
34c00 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
34c10 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
34c20 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
34c30 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
34c40 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
34c50 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
34c60 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
34c70 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
34c80 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
34c90 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
34ca0 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
34cb0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
34cc0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
34cd0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
34ce0 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
34cf0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
34d00 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
34d10 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
34d20 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
34d30 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
34d40 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
34d50 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
34d60 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
34d70 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
34d80 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
34d90 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
34da0 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
34db0 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
34dc0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
34dd0 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
34de0 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
34df0 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
34e00 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
34e10 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
34e20 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
34e30 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
34e40 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
34e50 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
34e60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
34e70 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
34e80 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
34e90 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
34ea0 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
34eb0 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
34ec0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
34ed0 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
34ee0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
34ef0 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
34f00 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
34f10 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
34f20 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
34f30 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
34f40 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
34f50 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
34f60 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
34f70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
34f80 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
34f90 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
34fa0 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
34fb0 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
34fc0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
34fd0 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
34fe0 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
34ff0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
35000 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
35010 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
35020 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
35030 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
35040 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
35050 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
35060 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
35070 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
35080 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
35090 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
350a0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
350b0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
350c0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
350d0 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
350e0 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
350f0 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
35100 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
35110 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
35120 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
35130 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
35140 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
35150 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
35160 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
35170 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
35180 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
35190 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
351a0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
351b0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
351c0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
351d0 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
351e0 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
351f0 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
35200 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
35210 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
35220 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
35230 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
35240 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
35250 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
35260 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
35270 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
35280 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
35290 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
352a0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
352b0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
352c0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
352d0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
352e0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
352f0 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
35300 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
35310 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
35320 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
35330 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
35340 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
35350 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
35360 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35370 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
35380 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
35390 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
353a0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
353b0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
353c0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
353d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
353e0 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
353f0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
35400 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
35410 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
35420 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
35430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35440 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
35450 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
35460 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35470 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
35480 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
35490 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
354a0 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
354b0 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
354c0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
354d0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
354e0 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
354f0 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
35500 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
35510 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
35520 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
35530 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
35540 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
35550 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
35560 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
35570 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
35580 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
35590 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
355a0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
355b0 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
355c0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
355d0 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
355e0 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
355f0 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
35600 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
35610 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
35620 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
35630 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
35640 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
35650 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
35660 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
35670 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
35680 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
35690 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
356a0 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
356b0 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
356c0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
356d0 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
356e0 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
356f0 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
35700 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
35710 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
35720 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
35730 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
35740 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35750 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
35760 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
35770 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
35780 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
35790 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
357a0 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
357b0 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
357c0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
357d0 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
357e0 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
357f0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
35800 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
35810 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
35820 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
35830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35840 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
35850 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
35860 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
35870 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
35880 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
35890 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
358a0 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
358b0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
358c0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
358d0 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
358e0 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
358f0 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
35900 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
35910 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
35920 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
35930 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
35940 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
35950 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
35960 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
35970 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
35980 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
35990 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
359a0 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
359b0 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
359c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
359d0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
359e0 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
359f0 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
35a00 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
35a10 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
35a20 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
35a30 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
35a40 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
35a50 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
35a60 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
35a70 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
35a80 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
35a90 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
35aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35ab0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
35ac0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
35ad0 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
35ae0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
35af0 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
35b00 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
35b10 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
35b20 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
35b30 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
35b40 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
35b50 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
35b60 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
35b70 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
35b80 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
35b90 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
35ba0 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
35bb0 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
35bc0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
35bd0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
35be0 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
35bf0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
35c00 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
35c10 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
35c20 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
35c30 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
35c40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
35c50 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
35c60 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
35c70 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
35c80 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
35c90 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
35ca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
35cb0 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
35cc0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
35cd0 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
35ce0 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
35cf0 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
35d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35d10 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
35d20 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
35d30 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
35d40 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
35d50 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
35d60 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
35d70 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
35d80 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
35d90 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
35da0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
35db0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
35dc0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
35dd0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
35de0 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
35df0 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
35e00 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
35e10 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
35e20 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
35e30 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
35e40 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
35e50 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
35e60 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
35e70 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
35e80 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
35e90 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
35ea0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
35eb0 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
35ec0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
35ed0 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
35ee0 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
35ef0 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
35f00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35f10 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
35f20 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
35f30 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
35f40 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
35f50 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
35f60 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
35f70 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
35f80 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
35f90 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
35fa0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
35fb0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
35fc0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
35fd0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
35fe0 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
35ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36000 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
36010 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
36020 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
36030 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
36040 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
36050 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
36060 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
36070 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
36080 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
36090 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
360a0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
360b0 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
360c0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
360d0 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
360e0 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
360f0 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
36100 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
36110 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
36120 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
36130 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
36140 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
36150 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
36160 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
36170 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
36180 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
36190 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
361a0 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
361b0 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
361c0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
361d0 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
361e0 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
361f0 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
36200 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
36210 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
36220 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
36230 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
36240 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
36250 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
36260 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
36270 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
36280 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
36290 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
362a0 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
362b0 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
362c0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
362d0 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
362e0 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
362f0 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
36300 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
36310 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
36320 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
36330 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
36340 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
36350 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
36360 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
36370 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
36380 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
36390 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
363a0 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
363b0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
363c0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
363d0 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
363e0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
363f0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
36400 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
36410 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
36420 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
36430 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
36440 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
36450 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
36460 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
36470 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
36480 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
36490 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
364a0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
364b0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
364c0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
364d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
364e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
364f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
36500 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
36510 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36520 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
36530 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
36540 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
36550 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
36560 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
36570 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
36580 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
36590 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
365a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
365b0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
365c0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
365d0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
365e0 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
365f0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
36600 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
36610 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
36620 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
36630 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
36640 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
36650 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
36660 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
36670 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
36680 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
36690 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
366a0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
366b0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
366c0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
366d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
366e0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
366f0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
36700 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
36710 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
36720 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
36730 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
36740 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20    int nFails;   
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36760 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63  * Number of conc
36770 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65  h taking failure
36780 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
36790 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
367a0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
367b0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
367c0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
367d0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
367e0 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
367f0 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
36800 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
36810 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
36820 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
36830 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
36840 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
36850 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
36860 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
36870 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
36880 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
36890 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
368a0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
368b0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
368c0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
368d0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
368e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
368f0 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
36900 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
36910 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
36920 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
36930 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
36940 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
36950 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
36960 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
36970 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
36980 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
36990 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
369a0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
369b0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
369c0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
369d0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
369e0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
369f0 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
36a00 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
36a10 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
36a20 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
36a30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36a40 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
36a50 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
36a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36a70 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
36a80 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
36a90 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
36aa0 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
36ab0 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
36ac0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
36ad0 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
36ae0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
36af0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
36b00 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
36b10 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
36b20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
36b30 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
36b40 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
36b50 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
36b60 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
36b70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
36b80 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
36b90 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
36ba0 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
36bb0 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
36bc0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
36bd0 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
36be0 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
36bf0 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
36c00 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
36c10 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
36c20 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
36c30 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
36c40 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
36c50 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
36c60 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
36c70 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
36c80 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
36c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36ca0 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
36cb0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
36cc0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
36cd0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
36ce0 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
36cf0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36d00 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
36d10 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
36d20 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
36d30 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
36d40 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
36d50 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
36d60 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
36d70 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
36d80 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
36d90 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
36da0 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
36db0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
36dc0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
36dd0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
36de0 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
36df0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
36e00 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
36e10 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
36e20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
36e30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
36e40 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
36e50 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
36e60 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
36e70 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
36e80 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
36e90 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
36ea0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
36eb0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
36ec0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
36ed0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
36ee0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
36ef0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
36f00 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
36f10 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
36f20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c  if( osMkdir(buf,
36f30 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
36f40 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
36f50 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
36f60 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
36f70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36f80 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
36f90 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
36fa0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
36fb0 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
36fc0 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
36fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fe0 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
36ff0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
37000 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37010 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
37020 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
37030 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
37040 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
37050 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
37060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37070 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
37080 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
37090 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
370a0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
370b0 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
370c0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
370d0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
370e0 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
370f0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
37100 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
37110 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79  atic int isProxy
37120 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78  LockingMode(unix
37130 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20  File *pFile) {. 
37140 20 72 65 74 75 72 6e 20 28 70 46 69 6c 65 2d 3e   return (pFile->
37150 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
37160 79 49 6f 4d 65 74 68 6f 64 73 29 20 3f 20 31 20  yIoMethods) ? 1 
37170 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  : 0;.}../*.** Re
37180 74 75 72 6e 20 74 68 65 20 73 68 61 72 65 64 20  turn the shared 
37190 6d 65 6d 6f 72 79 20 62 61 73 65 20 70 61 74 68  memory base path
371a0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f   based on the lo
371b0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 69 66  ck proxy file if
371c0 20 74 68 65 20 0a 2a 2a 20 6c 6f 63 6b 20 70 72   the .** lock pr
371d0 6f 78 79 20 66 69 6c 65 20 69 73 20 68 6f 73 74  oxy file is host
371e0 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 20 6d  ed on a shared m
371f0 65 6d 6f 72 79 20 63 6f 6d 70 61 74 69 62 6c 65  emory compatible
37200 20 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   FS.*/.static co
37210 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53  nst char *proxyS
37220 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50  haredMemoryBaseP
37230 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
37240 69 6c 65 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ile) {.  proxyLo
37250 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37260 74 78 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  tx;.  unixFile *
37270 70 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 0a 20 20  pLockFile;.  .  
37280 61 73 73 65 72 74 28 70 46 69 6c 65 21 3d 4e 55  assert(pFile!=NU
37290 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  LL && pFile->loc
372a0 6b 69 6e 67 43 6f 6e 74 65 78 74 21 3d 4e 55 4c  kingContext!=NUL
372b0 4c 29 3b 0a 20 20 61 73 73 65 72 74 28 70 46 69  L);.  assert(pFi
372c0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
372d0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
372e0 0a 20 20 70 43 74 78 20 3d 20 28 28 70 72 6f 78  .  pCtx = ((prox
372f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37300 2a 29 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *)(pFile->lockin
37310 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 4c  gContext));.  pL
37320 6f 63 6b 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  ockFile = pCtx->
37330 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 69 66 28  lockProxy;.  if(
37340 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74   pLockFile->pMet
37350 68 6f 64 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  hod->iVersion>=2
37360 20 26 26 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70   && pLockFile->p
37370 4d 65 74 68 6f 64 2d 3e 78 53 68 6d 4d 61 70 21  Method->xShmMap!
37380 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
37390 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
373a0 50 61 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Path;.  }.  retu
373b0 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn NULL;.}../*.*
373c0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
373d0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
373e0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
373f0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
37400 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
37410 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
37420 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
37430 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
37440 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
37450 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
37460 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
37470 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
37480 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
37490 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
374a0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
374b0 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
374c0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
374d0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
374e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
374f0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
37500 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
37510 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
37520 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
37530 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
37540 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
37550 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
37560 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
37570 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
37580 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
37590 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
375a0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
375b0 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
375c0 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
375d0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
375e0 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
375f0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
37600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37610 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
37620 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
37630 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
37640 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
37650 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
37660 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
37670 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
37680 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
37690 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
376a0 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
376b0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
376c0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
376d0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
376e0 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
376f0 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
37700 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
37710 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
37720 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
37730 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
37740 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
37750 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
37760 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
37770 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
37780 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
37790 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
377a0 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
377b0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
377c0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
377d0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
377e0 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
377f0 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
37800 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
37810 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
37820 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
37830 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
37840 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
37850 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37860 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
37870 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
37880 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
37890 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
378a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
378b0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
378c0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
378d0 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
378e0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
378f0 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
37900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
37910 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
37920 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
37930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
37940 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
37950 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
37960 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
37970 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
37980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37990 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
379a0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
379b0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
379c0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
379d0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
379e0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
379f0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
37a00 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
37a10 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
37a20 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
37a30 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
37a40 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 6c  ed);.    if( isl
37a50 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
37a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37a70 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
37a80 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
37a90 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
37aa0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
37ab0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
37ac0 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
37ad0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37ae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37af0 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
37b00 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
37b10 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
37b20 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
37b30 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
37b40 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
37b50 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
37b60 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
37b70 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
37b80 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
37b90 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
37ba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
37bb0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
37bc0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
37bd0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
37be0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
37bf0 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
37c00 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
37c10 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
37c20 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
37c30 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
37c40 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
37c50 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
37c60 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
37c70 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
37c80 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
37c90 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
37ca0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
37cb0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
37cc0 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
37cd0 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
37ce0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
37cf0 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
37d00 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
37d10 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29  *)pNew, path, 0)
37d20 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37d30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
37d40 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
37d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37d60 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
37d70 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72  e_proxy:    .  r
37d80 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
37d90 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
37da0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
37db0 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  pNew);.  sqlite3
37dc0 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a  _free(pUnused);.
37dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37de0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
37df0 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
37e00 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
37e10 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
37e20 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
37e30 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
37e40 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
37e50 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
37e60 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  e PROXY_HOSTIDLE
37e70 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63  N    16  /* conc
37e80 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c  h file host id l
37e90 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74  ength */../* Not
37ea0 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20   always defined 
37eb0 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61  in the headers a
37ec0 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  s it ought to be
37ed0 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67   */.extern int g
37ee0 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f  ethostuuid(uuid_
37ef0 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75  t id, const stru
37f00 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69  ct timespec *wai
37f10 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  t);../* get the 
37f20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68  host ID via geth
37f30 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74  ostuuid(), pHost
37f40 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ID must point to
37f50 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37f60 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72   .** bytes of wr
37f70 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  itable memory..*
37f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37f90 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69  xyGetHostID(unsi
37fa0 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74  gned char *pHost
37fb0 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
37fc0 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59  {.  assert(PROXY
37fd0 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69  _HOSTIDLEN == si
37fe0 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20  zeof(uuid_t));. 
37ff0 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c   memset(pHostID,
38000 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   0, PROXY_HOSTID
38010 4c 45 4e 29 3b 0a 23 69 66 20 48 41 56 45 5f 47  LEN);.#if HAVE_G
38020 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20  ETHOSTUUID.  {. 
38030 20 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70     struct timesp
38040 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
38050 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
38060 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 0a 20 20  meout */.    .  
38070 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
38080 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
38090 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
380a0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
380b0 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
380c0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
380d0 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
380e0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
380f0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
38100 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
38110 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
38120 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
38130 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
38140 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
38150 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
38160 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
38170 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
38180 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
38190 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
381a0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
381b0 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
381c0 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
381d0 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
381e0 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
381f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
38200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38210 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
38220 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
38230 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
38240 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
38250 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
38260 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
38270 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
38280 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
38290 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
382a0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
382b0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
382c0 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
382d0 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
382e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
382f0 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
38300 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
38310 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
38320 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
38330 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
38340 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
38350 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
38360 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
38370 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
38380 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
38390 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
383a0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
383b0 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
383c0 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
383d0 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
383e0 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
383f0 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
38400 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
38410 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
38420 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
38430 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
38440 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
38450 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
38460 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
38470 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
38480 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
38490 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
384a0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
384b0 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
384c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
384d0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
384e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
384f0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
38500 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
38510 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
38520 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
38530 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
38540 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
38550 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
38560 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
38570 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
38580 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
38590 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
385a0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
385b0 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
385c0 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64]