/ Hex Artifact Content
Login

Artifact bc2bed8caed600bb76a0ab6573ae1bf3c303717f:


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 73  .#endif../*.** s
0c70: 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65 20  tandard include 
0c80: 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  files..*/.#inclu
0c90: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
0ca0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
0cb0: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
0cc0: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75  <fcntl.h>.#inclu
0cd0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
0ce0: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
0cf0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
0d00: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0d10: 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64 65  errno.h>.#if !de
0d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0d30: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
0d40: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
0d50: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  .#include <sys/m
0d60: 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a  man.h>.#endif...
0d70: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
0d80: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0d90: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69  # include <sys/i
0da0: 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  octl.h>.# includ
0db0: 65 20 3c 75 75 69 64 2f 75 75 69 64 2e 68 3e 0a  e <uuid/uuid.h>.
0dc0: 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  # if defined(__A
0dd0: 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f 4d  PPLE__) && ((__M
0de0: 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AC_OS_X_VERSION_
0df0: 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20 31  MIN_REQUIRED > 1
0e00: 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20 20  050) || \.      
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e30: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0e40: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0e50: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
0e60: 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a 23 20  GETHOSTUUID 1.# 
0e70: 65 6e 64 69 66 0a 23 20 69 66 20 4f 53 5f 56 58  endif.# if OS_VX
0e80: 57 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65  WORKS.#  include
0e90: 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23   <semaphore.h>.#
0ea0: 20 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74    include <limit
0eb0: 73 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69  s.h>.# else.#  i
0ec0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65  nclude <sys/file
0ed0: 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  .h>.#  include <
0ee0: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65  sys/param.h>.# e
0ef0: 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ndif.#endif /* S
0f00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0f10: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
0f20: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0f30: 4c 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45  LE__) || (SQLITE
0f40: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0f50: 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
0f60: 4f 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20  ORKS).# include 
0f70: 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65  <sys/mount.h>.#e
0f80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56  ndif..#ifdef HAV
0f90: 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64  E_UTIME.# includ
0fa0: 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64  e <utime.h>.#end
0fb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
0fc0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
0fd0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
0fe0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
0ff0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1000: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1010: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1020: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1030: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1040: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1050: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1060: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1070: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1080: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1090: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
10a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
10b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
10c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
10d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
10e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
10f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1100: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1110: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1120: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1130: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1140: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1150: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1160: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  *.** Default per
1170: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
1180: 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78  eating auto prox
1190: 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66  y dir.*/.#ifndef
11a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11b0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
11c0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
11d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
11e0: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
11f0: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1200: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1210: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1220: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1230: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1240: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1250: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1260: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1270: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
1280: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
1290: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
12a0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
12b0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
12c0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
12d0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
12e0: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
12f0: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1300: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1310: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1320: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1330: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1340: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1350: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1360: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1370: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1380: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
1390: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
13a0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
13b0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
13c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
13d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
13e0: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
13f0: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1400: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1410: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1420: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1430: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1440: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1450: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1460: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
1470: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
1480: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
1490: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
14a0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
14b0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
14c0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
14d0: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
14e0: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
14f0: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1500: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1510: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1520: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1530: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1540: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1550: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1560: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
1570: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1590: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
15a0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
15b0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
15c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
15d0: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
15e0: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
15f0: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1600: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1610: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1620: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1630: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1640: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1650: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1660: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
1670: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
1680: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
1690: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
16a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
16b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16c0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
16d0: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
16e0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
16f0: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1700: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1710: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1720: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
1730: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1750: 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63  * The VFS that c
1760: 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78  reated this unix
1770: 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  File */.  unixIn
1780: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17a0: 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b   Info about lock
17b0: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
17c0: 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1800: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1810: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
1820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1830: 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c  type of lock hel
1840: 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a  d on this fd */.
1850: 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74    unsigned short
1860: 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20   int ctrlFlags; 
1870: 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f        /* Behavio
1880: 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46  ral bits.  UNIXF
1890: 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20  ILE_* flags */. 
18a0: 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20   int lastErrno; 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78       /* The unix
18d0: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74   errno from last
18e0: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20   I/O error */.  
18f0: 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e  void *lockingCon
1900: 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  text;           
1910: 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73      /* Locking s
1920: 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74  tyle specific st
1930: 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ate */.  UnixUnu
1940: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1960: 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e  Pre-allocated Un
1970: 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20  ixUnusedFd */.  
1980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1990: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
19a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
19b0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  he file */.  uni
19c0: 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20  xShm *pShm;     
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
19f0: 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d  y segment inform
1a00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73  ation */.  int s
1a10: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a30: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * Configured by 
1a40: 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1a50: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   */.#if SQLITE_M
1a60: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1a70: 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20   int nFetchOut; 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1aa0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  f outstanding xF
1ab0: 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73  etch refs */.  s
1ac0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1ad0: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  pSize;          
1ae0: 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a     /* Usable siz
1af0: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b00: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b10: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b20: 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20  apSizeActual;   
1b30: 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69      /* Actual si
1b40: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1b50: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1b60: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1b70: 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20  mapSizeMax;     
1b80: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1b90: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
1ba0: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f  ZE value */.  vo
1bb0: 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20  id *pMapRegion; 
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
1be0: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e  ed region */.#en
1bf0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  dif.#ifdef __QNX
1c00: 4e 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74  NTO__.  int sect
1c10: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c30: 65 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a  evice sector siz
1c40: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63  e */.  int devic
1c50: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1c60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ;          /* Pr
1c70: 65 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65  ecomputed device
1c80: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1c90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1ca0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cb0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1cc0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1cd0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1d00: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1d10: 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69   open() */.#endi
1d20: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1d30: 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1d40: 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  ION.  int protFl
1d50: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d70: 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61  a protection fla
1d80: 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e  gs from unixOpen
1d90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1da0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1db0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1dc0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1dd0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1de0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1df0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1e00: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1e10: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1e20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1e30: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1e40: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1e50: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1e60: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1e70: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e90: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1ea0: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1eb0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1ec0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ed0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ee0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ef0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1f00: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f10: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f20: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f30: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f40: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f50: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f60: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f70: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f80: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fa0: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fb0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fc0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fd0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fe0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1ff0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2000: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2010: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2020: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2030: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2050: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2060: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2070: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2080: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2090: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
20a0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20c0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20e0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2100: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2110: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
2120: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
2130: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2140: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2150: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2160: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2170: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2180: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2190: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
21a0: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
21b0: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
21c0: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
21d0: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
21e0: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
21f0: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2200: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2210: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
2220: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
2230: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
2240: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2250: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2260: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
2270: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2280: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2290: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
22a0: 69 6e 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  int randomnessPi
22b0: 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c  d = 0;../*.** Al
22c0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72  lowed values for
22d0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74   the unixFile.ct
22e0: 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a  rlFlags bitmask:
22f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
2300: 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20  FILE_EXCL       
2310: 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e   0x01     /* Con
2320: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e  nections from on
2330: 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a  e process only *
2340: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2350: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30  LE_RDONLY      0
2360: 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x02     /* Conne
2370: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
2380: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2390: 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
23a0: 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50  AL 0x04     /* P
23b0: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
23c0: 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  de */.#ifndef SQ
23d0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
23e0: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e  SYNC.# define UN
23f0: 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20  IXFILE_DIRSYNC  
2400: 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69    0x08     /* Di
2410: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65  rectory sync nee
2420: 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64  ded */.#else.# d
2430: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2440: 49 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23  IRSYNC    0x00.#
2450: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e  endif.#define UN
2460: 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  IXFILE_PSOW     
2470: 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53     0x10     /* S
2480: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
2490: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
24a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
24b0: 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ILE_DELETE      
24c0: 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65  0x20     /* Dele
24d0: 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23  te on close */.#
24e0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24f0: 55 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30  URI         0x40
2500: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
2510: 20 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72   might have quer
2520: 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  y parameters */.
2530: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2540: 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38  _NOLOCK      0x8
2550: 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66  0     /* Do no f
2560: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23  ile locking */.#
2570: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2580: 57 41 52 4e 45 44 20 20 20 20 30 78 30 31 30 30  WARNED    0x0100
2590: 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79 44 62       /* verifyDb
25a0: 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67 73 20  File() warnings 
25b0: 68 61 76 65 20 62 65 65 6e 20 69 73 73 75 65 64  have been issued
25c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
25d0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
25e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
25f0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
2600: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
2610: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2620: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2630: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2640: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2650: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2660: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2670: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2680: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2690: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
26a0: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
26b0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
26c0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
26d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
26e0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
26f0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
2700: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
2710: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2720: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2730: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2740: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2750: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2760: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2770: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2780: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2790: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
27a0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
27b0: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
27c0: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
27d0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
27e0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
27f0: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  f..#ifdef __APPL
2800: 45 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  E__.#define SQLI
2810: 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c  TE_ENABLE_SUPERL
2820: 4f 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  OCK 1.#endif..#i
2830: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2840: 53 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75  SUPERLOCK.#inclu
2850: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
2860: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
2870: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
2880: 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20  ert.h>../*.** A 
2890: 73 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c  structure to col
28a0: 6c 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64  lect a busy-hand
28b0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  ler callback and
28c0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20   argument and a 
28d0: 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  count.** of the 
28e0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
28f0: 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f  it has been invo
2900: 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ked..*/.struct S
2910: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20  uperlockBusy {. 
2920: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
2930: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20  id*,int);       
2940: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
2950: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
2960: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
2970: 70 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20  pBusyArg;       
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2990: 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74  st arg to pass t
29a0: 6f 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74  o xBusy */.  int
29b0: 20 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20   nBusy;         
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
29e0: 78 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69  xBusy has been i
29f0: 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70  nvoked */.};.typ
2a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65  edef struct Supe
2a10: 72 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c  rlockBusy Superl
2a20: 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20  ockBusy;../*.** 
2a30: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2a40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2a50: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
2a60: 74 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74  ted for each act
2a70: 69 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b  ive.** superlock
2a80: 2e 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e  . The opaque han
2a90: 64 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  dle returned by 
2aa0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
2ab0: 72 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63  rlock() is.** ac
2ac0: 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
2ad0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
2ae0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
2af0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70  e..*/.struct Sup
2b00: 65 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74  erlock {.  sqlit
2b10: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2b30: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73  tabase handle us
2b40: 65 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f  ed to lock db */
2b50: 0a 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20  .  int bWal;    
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62     /* True if db
2b80: 20 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61   is a WAL databa
2b90: 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  se */.};.typedef
2ba0: 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63   struct Superloc
2bb0: 6b 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a  k Superlock;../*
2bc0: 0a 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69  .** The pCtx poi
2bd0: 6e 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  nter passed to t
2be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2bf0: 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
2c00: 65 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72  er to a.** Super
2c10: 6c 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75  lockBusy structu
2c20: 72 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  re. Invoke the b
2c30: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
2c40: 74 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65  tion encapsulate
2c50: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75  d.** by the stru
2c60: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
2c70: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a   the result..*/.
2c80: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
2c90: 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28  lockBusyHandler(
2ca0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20  void *pCtx, int 
2cb0: 55 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72  UNUSED){.  Super
2cc0: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
2cd0: 3d 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  = (SuperlockBusy
2ce0: 20 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70   *)pCtx;.  if( p
2cf0: 42 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29  Busy->xBusy==0 )
2d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
2d10: 75 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79  urn pBusy->xBusy
2d20: 28 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67  (pBusy->pBusyArg
2d30: 2c 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b  , pBusy->nBusy++
2d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2d50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2d60: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
2d70: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
2d80: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  ase file for .**
2d90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
2da0: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
2db0: 64 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f  de or not. If no
2dc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
2dd0: 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
2de0: 65 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c  e file is in WAL
2df0: 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61   mode, set *pbWa
2e00: 6c 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65  l to true and re
2e10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2e20: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
2e30: 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74  in WAL mode, set
2e40: 20 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65   *pbWal to false
2e50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2e60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
2e70: 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
2e80: 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c  or code. The val
2e90: 75 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20  ue of *pbWal.** 
2ea0: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2eb0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
2ec0: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
2ed0: 63 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63  ckIsWal(Superloc
2ee0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
2ef0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f10: 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2f20: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2f30: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2f40: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41   /* Compiled PRA
2f50: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
2f60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
2f70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2f80: 65 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c  epare(pLock->db,
2f90: 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f   "PRAGMA main.jo
2fa0: 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c  urnal_mode", -1,
2fb0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2fc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
2fe0: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30   pLock->bWal = 0
2ff0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
3000: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
3010: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63  (pStmt) ){.    c
3020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
3030: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
3040: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
3050: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
3060: 20 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26      if( zMode &&
3070: 20 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d   strlen(zMode)==
3080: 33 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  3 && sqlite3_str
3090: 6e 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f  nicmp("wal", zMo
30a0: 64 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  de, 3)==0 ){.   
30b0: 20 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d     pLock->bWal =
30c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
30d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
30e0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
30f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
3100: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68   an exclusive sh
3110: 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20  m-lock on nByte 
3120: 62 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61  bytes starting a
3130: 74 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20  t offset idx.** 
3140: 6f 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20  of the file fd. 
3150: 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
3160: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69  ot be obtained i
3170: 6d 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f  mmediately, invo
3180: 6b 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68  ke.** the busy-h
3190: 61 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74  andler until eit
31a0: 68 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e  her it is obtain
31b0: 65 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68  ed or the busy-h
31c0: 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61  andler.** callba
31d0: 63 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f  ck returns 0..*/
31e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65  .static int supe
31f0: 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20  rlockShmLock(.  
3200: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3220: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
3230: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
3240: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3260: 4f 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f  Offset of shm-lo
3270: 63 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a  ck to obtain */.
3280: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
32b0: 6f 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20  onsective bytes 
32c0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70  to lock */.  Sup
32d0: 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73  erlockBusy *pBus
32e0: 79 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y            /* 
32f0: 42 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61  Busy-handler wra
3300: 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  pper object */.)
3310: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
3320: 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71  t (*xShmLock)(sq
3330: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
3340: 2c 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64  , int, int) = fd
3350: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3360: 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Lock;.  do {.   
3370: 20 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66   rc = xShmLock(f
3380: 64 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53  d, idx, nByte, S
3390: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53  QLITE_SHM_LOCK|S
33a0: 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
33b0: 49 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  IVE);.  }while( 
33c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
33d0: 26 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  && superlockBusy
33e0: 48 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29  Handler((void *)
33f0: 70 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72  pBusy, 0) );.  r
3400: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3410: 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78  ** Obtain the ex
3420: 74 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  tra locks on the
3430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72   database file r
3440: 65 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20  equired for WAL 
3450: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e  databases..** In
3460: 76 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65  voke the supplie
3470: 64 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61  d busy-handler a
3480: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
3490: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
34a0: 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71  ockWalLock(.  sq
34b0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
34e0: 20 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74   open on WAL dat
34f0: 61 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72  abase */.  Super
3500: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
3510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
3520: 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy handler wrapp
3530: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
3540: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
3570: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
3580: 6c 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20  le *fd = 0;     
3590: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61        /* Main da
35a0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
35b0: 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  le */.  void vol
35c0: 61 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20  atile *p = 0;   
35d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35e0: 65 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  er to first page
35f0: 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   of shared memor
3600: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  y */..  /* Obtai
3610: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3620: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
3630: 6f 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74  object open on t
3640: 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e  he main db file.
3650: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
3660: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
3670: 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
3680: 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
3690: 49 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26  INTER, (void *)&
36a0: 66 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  fd);.  if( rc!=S
36b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36c0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  n rc;..  /* Obta
36d0: 69 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79  in the "recovery
36e0: 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79  " lock. Normally
36f0: 2c 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f  , this lock is o
3700: 6e 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a  nly obtained by.
3710: 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e    ** clients run
3720: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65  ning database re
3730: 63 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20  covery.  .  */. 
3740: 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53   rc = superlockS
3750: 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c  hmLock(fd, 2, 1,
3760: 20 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72   pBusy);.  if( r
3770: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3780: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
3790: 5a 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f  Zero the start o
37a0: 66 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72  f the first shar
37b0: 65 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20  ed-memory page. 
37c0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
37d0: 61 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73  any.  ** clients
37e0: 20 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20   that open read 
37f0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3800: 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20  tions from this 
3810: 70 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20  point on will.  
3820: 2a 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72  ** have to run r
3830: 65 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70  ecovery before p
3840: 72 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65  roceeding. Since
3850: 20 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22   they need the "
3860: 72 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c  recovery".  ** l
3870: 6f 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72  ock that this pr
3880: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
3890: 20 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20   to do that, no 
38a0: 6e 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74  new read or writ
38b0: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
38c0: 6f 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f  ons may now be o
38d0: 70 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61  pened. Nor can a
38e0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72   checkpoint be r
38f0: 75 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  un, for the.  **
3900: 20 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20   same reason..  
3910: 2a 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d  */.  rc = fd->pM
3920: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
3930: 66 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  fd, 0, 32*1024, 
3940: 31 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63  1, &p);.  if( rc
3950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
3960: 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65  turn rc;.  memse
3970: 74 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20  t((void *)p, 0, 
3980: 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  32);..  /* Obtai
3990: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
39a0: 73 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65  s on all the "re
39b0: 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20  ad-lock" slots. 
39c0: 4f 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73  Once these locks
39d0: 0a 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20  .  ** are held, 
39e0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
39f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
3a00: 6e 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72  no active reader
3a10: 2c 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a  , writer or .  *
3a20: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63  * checkpointer c
3a30: 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72  lients..  */.  r
3a40: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d  c = superlockShm
3a50: 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49  Lock(fd, 3, SQLI
3a60: 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20  TE_SHM_NLOCK-3, 
3a70: 70 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e  pBusy);.  return
3a80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
3a90: 6c 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63  lease a superloc
3aa0: 6b 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61  k held on a data
3ab0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
3ac0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
3ad0: 6f 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  o .** this funct
3ae0: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65  ion must have be
3af0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
3b00: 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
3b10: 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
3b20: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29  demo_superlock()
3b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3b40: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
3b50: 65 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70  erunlock(void *p
3b60: 4c 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f  Lock){.  Superlo
3b70: 63 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f  ck *p = (Superlo
3b80: 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66  ck *)pLock;.  if
3b90: 28 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20  ( p->bWal ){.   
3ba0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3bd0: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
3be0: 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   = SQLITE_SHM_UN
3bf0: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
3c00: 4d 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  M_EXCLUSIVE;.   
3c10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
3c20: 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  d = 0;.    rc = 
3c30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
3c40: 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69  trol(p->db, "mai
3c50: 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
3c60: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20  _FILE_POINTER,. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
3c90: 64 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66  d *)&fd);.    if
3ca0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3cb0: 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65  ){.      fd->pMe
3cc0: 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28  thods->xShmLock(
3cd0: 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29  fd, 2, 1, flags)
3ce0: 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  ;.      fd->pMet
3cf0: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3d00: 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d  d, 3, SQLITE_SHM
3d10: 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29  _NLOCK-3, flags)
3d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
3d30: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
3d40: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
3d50: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
3d60: 4f 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f  Obtain a superlo
3d70: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
3d80: 73 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69  se file identifi
3d90: 65 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69  ed by zPath, usi
3da0: 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  ng the.** lockin
3db0: 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f  g primitives pro
3dc0: 76 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66  vided by VFS zVf
3dd0: 73 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  s. If successful
3de0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  , SQLITE_OK is.*
3df0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f  * returned and o
3e00: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
3e10: 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61  ppLock is popula
3e20: 74 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71  ted with an opaq
3e30: 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61  ue handle.** tha
3e40: 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69  t may be used wi
3e50: 74 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  th sqlite3demo_s
3e60: 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  uperunlock() to 
3e70: 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  release the lock
3e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
3e90: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c  ror occurs, *ppL
3ea0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20  ock is set to 0 
3eb0: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
3ec0: 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e  ror code .** (e.
3ed0: 67 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20  g. SQLITE_BUSY) 
3ee0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
3ef0: 2a 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64  ** If a required
3f00: 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
3f10: 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61  obtained immedia
3f20: 74 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75  tely and the xBu
3f30: 73 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  sy parameter.** 
3f40: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
3f50: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
3f60: 65 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f  en xBusy is invo
3f70: 6b 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ked in the same 
3f80: 77 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79  way.** as a busy
3f90: 2d 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65  -handler registe
3fa0: 72 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20  red with SQLite 
3fb0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62  (using sqlite3_b
3fc0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a  usy_handler()).*
3fd0: 2a 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74  * until either t
3fe0: 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f  he lock can be o
3ff0: 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62  btained or the b
4000: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
4010: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
4020: 30 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67  0 (indicating "g
4030: 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61  ive up")..*/.sta
4040: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64  tic int sqlite3d
4050: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20  emo_superlock(. 
4060: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
4070: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
4080: 20 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61   /* Path to data
4090: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63  base file to loc
40a0: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
40b0: 72 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20  r *zVfs,        
40c0: 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
40d0: 20 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64   use to access d
40e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
40f0: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4110: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61  * Additional fla
4120: 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71  gs to pass to sq
4130: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f  lite3_open_v2 */
4140: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
4150: 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20  void*,int),     
4160: 20 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c     /* Busy handl
4170: 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  er callback */. 
4180: 20 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c   void *pBusyArg,
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20   /* Context arg 
41b0: 66 6f 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72  for busy handler
41c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c   */.  void **ppL
41d0: 6f 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ock             
41e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
41f0: 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
4200: 20 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a   superunlock() *
4210: 2f 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  /.){.  Superlock
4220: 42 75 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20  Busy busy = {0, 
4230: 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68  0, 0}; /* Busy h
4240: 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f  andler wrapper o
4250: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
4260: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4280: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53  turn code */.  S
4290: 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b  uperlock *pLock;
42a0: 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69  ..  pLock = sqli
42b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
42c0: 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20  f(Superlock));. 
42d0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65   if( !pLock ) re
42e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
42f0: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63  M;.  memset(pLoc
4300: 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70  k, 0, sizeof(Sup
4310: 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20  erlock));..  /* 
4320: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
4330: 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69  handle on the fi
4340: 6c 65 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e  le to superlock.
4350: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
4360: 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20  e3_open_v2(.    
4370: 20 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d    zPath, &pLock-
4380: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  >db, SQLITE_OPEN
4390: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
43a0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c  E_OPEN_CREATE|fl
43b0: 61 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a  ags, zVfs.  );..
43c0: 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62    /* Install a b
43d0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20  usy-handler and 
43e0: 65 78 65 63 75 74 65 20 61 20 42 45 47 49 4e 20  execute a BEGIN 
43f0: 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
4400: 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
4410: 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74   WAL database, t
4420: 68 69 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65  his is all we ne
4430: 65 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a  ed to do.  .  **
4440: 0a 20 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20  .  ** A wrapper 
4450: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
4460: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62   to invoke the b
4470: 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74  usy-handler inst
4480: 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69  ead of.  ** regi
4490: 73 74 65 72 69 6e 67 20 74 68 65 20 62 75 73 79  stering the busy
44a0: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
44b0: 6e 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68  n supplied by th
44c0: 65 20 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a  e user directly.
44d0: 20 20 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65    ** with SQLite
44e0: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
44f0: 65 20 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d  e the same busy-
4500: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
4510: 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76   may be.  ** inv
4520: 6f 6b 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61  oked directly la
4530: 74 65 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65  ter on when atte
4540: 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e  mpting to obtain
4550: 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73   the extra locks
4560: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69  .  ** required i
4570: 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75  n WAL mode. By u
4580: 73 69 6e 67 20 74 68 65 20 77 72 61 70 70 65 72  sing the wrapper
4590: 2c 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  , we are able to
45a0: 20 67 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20   guarantee.  ** 
45b0: 74 68 61 74 20 74 68 65 20 22 6e 42 75 73 79 22  that the "nBusy"
45c0: 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74   integer paramet
45d0: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  er passed to the
45e0: 20 75 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64   users busy-hand
45f0: 6c 65 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65  ler.  ** represe
4600: 6e 74 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  nts the total nu
4610: 6d 62 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e  mber of busy-han
4620: 64 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73  dler invocations
4630: 20 6d 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a   made within.  *
4640: 2a 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73  * this call to s
4650: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4660: 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e  lock(), includin
4670: 67 20 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e  g any made durin
4680: 67 20 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49  g the.  ** "BEGI
4690: 4e 20 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20  N EXCLUSIVE"..  
46a0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
46b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75  ITE_OK ){.    bu
46c0: 73 79 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79  sy.xBusy = xBusy
46d0: 3b 0a 20 20 20 20 62 75 73 79 2e 70 42 75 73 79  ;.    busy.pBusy
46e0: 41 72 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a  Arg = pBusyArg;.
46f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
4700: 5f 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e  _handler(pLock->
4710: 64 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73  db, superlockBus
4720: 79 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20  yHandler, (void 
4730: 2a 29 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63  *)&busy);.    rc
4740: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4750: 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49  pLock->db, "BEGI
4760: 4e 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c  N EXCLUSIVE", 0,
4770: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
4780: 2a 20 49 66 20 74 68 65 20 42 45 47 49 4e 20 45  * If the BEGIN E
4790: 58 43 4c 55 53 49 56 45 20 77 61 73 20 65 78 65  XCLUSIVE was exe
47a0: 63 75 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  cuted successful
47b0: 6c 79 20 61 6e 64 20 74 68 69 73 20 69 73 20 61  ly and this is a
47c0: 20 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61   WAL.  ** databa
47d0: 73 65 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f  se, call superlo
47e0: 63 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f  ckWalLock() to o
47f0: 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20  btain the extra 
4800: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20  locks required. 
4810: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72   ** to prevent r
4820: 65 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20  eaders, writers 
4830: 61 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e  and/or checkpoin
4840: 74 65 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73  ters from access
4850: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20  ing the.  ** db 
4860: 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
4870: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
4880: 65 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a  e superlock..  *
4890: 2a 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74  *.  ** Before at
48a0: 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c  tempting any WAL
48b0: 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74   locks, commit t
48c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
48d0: 74 61 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a  tarted above.  *
48e0: 2a 20 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41  * to drop the WA
48f0: 4c 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  L read and write
4900: 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79   locks currently
4910: 20 68 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65   held. Otherwise
4920: 2c 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57  , the.  ** new W
4930: 41 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e  AL locks may con
4940: 66 6c 69 63 74 20 77 69 74 68 20 74 68 65 20 6f  flict with the o
4950: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ld..  */.  if( r
4960: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4970: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
4980: 4b 3d 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f  K==(rc = superlo
4990: 63 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20  ckIsWal(pLock)) 
49a0: 26 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29  && pLock->bWal )
49b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
49c0: 69 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d  ite3_exec(pLock-
49d0: 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
49e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
49f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
4a10: 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63   superlockWalLoc
4a20: 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75  k(pLock->db, &bu
4a30: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
4a40: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
4a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4a60: 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
4a70: 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b  uperunlock(pLock
4a80: 29 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d  );.    *ppLock =
4a90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
4aa0: 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b   *ppLock = pLock
4ab0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4ac0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72  rc;.}../* A corr
4ad0: 75 70 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72  upt DB won't wor
4ae0: 6b 20 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62  k with the sql-b
4af0: 61 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74  ased locking att
4b00: 65 6d 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a  empt, grab an .*
4b10: 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
4b20: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
4b30: 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
4b40: 42 55 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b  BUSY if the lock
4b50: 20 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72   fails .** retur
4b60: 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ns the current l
4b70: 6f 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f  ock level held o
4b80: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a  n sqlite3_file.*
4b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4ba0: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
4bb0: 63 6b 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71  ck_corrupt(.  sq
4bc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a  lite3_file *id,.
4bd0: 20 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c    int eTargetFil
4be0: 65 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46  eLock,.  int *pF
4bf0: 69 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69  ileLock.){.  uni
4c00: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
4c10: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
4c20: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  int eFileLock = 
4c30: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4c40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4c50: 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
4c60: 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67   eFileLock<eTarg
4c70: 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  etFileLock ){.  
4c80: 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
4c90: 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c  ethod->xLock(id,
4ca0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
4cb0: 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RED);.  }.  if( 
4cc0: 21 72 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f  !rc && SQLITE_LO
4cd0: 43 4b 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65  CK_SHARED<eTarge
4ce0: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4cf0: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4d00: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4d10: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c  SQLITE_LOCK_EXCL
4d20: 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66  USIVE);.  }.  if
4d30: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
4d40: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4d50: 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
4d60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65        pFile->pMe
4d70: 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64  thod->xUnlock(id
4d80: 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
4d90: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
4da0: 63 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69  c;.  }.  if (pFi
4db0: 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70  leLock) {.    *p
4dc0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
4dd0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Lock;.  }.  retu
4de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4e00: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
4e10: 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69  ock_corrupt(sqli
4e20: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
4e30: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
4e40: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
4e50: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
4e60: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4e70: 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
4e80: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
4e90: 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  k > eFileLock ){
4ea0: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4eb0: 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
4ec0: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4ed0: 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20  K_SHARED);.  }. 
4ee0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
4ef0: 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
4f00: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c  k ){.    int unl
4f10: 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70  ockRC = pFile->p
4f20: 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
4f30: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4f40: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21  NONE);.    if (!
4f50: 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52  rc) rc = unlockR
4f60: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
4f70: 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
4f80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4f90: 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a  UPERLOCK */.../*
4fa0: 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  .** HAVE_MREMAP 
4fb0: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65  defaults to true
4fc0: 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61   on Linux and fa
4fd0: 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65  lse everywhere e
4fe0: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  lse..*/.#if !def
4ff0: 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50  ined(HAVE_MREMAP
5000: 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  ).# if defined(_
5010: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
5020: 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45  ined(_GNU_SOURCE
5030: 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  ).#  define HAVE
5040: 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65  _MREMAP 1.# else
5050: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
5060: 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66  MREMAP 0.# endif
5070: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
5080: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
5090: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
50a0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
50b0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
50c0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
50d0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
50e0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
50f0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
5100: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
5110: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
5120: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
5130: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
5140: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
5150: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
5160: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
5170: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
5180: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
5190: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
51a0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
51b0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
51c0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
51d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
51e0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
51f0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
5200: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
5210: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
5220: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
5230: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
5240: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
5250: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
5260: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
5270: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
5280: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
5290: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
52a0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
52b0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
52c0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
52d0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
52e0: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
52f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
5300: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
5310: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
5320: 74 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  t gid){.  return
5330: 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a   geteuid() ? 0 :
5340: 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67   fchown(fd,uid,g
5350: 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  id);.}../* Forwa
5360: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5370: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
5380: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
5390: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  har*, int*);.sta
53a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70  tic int unixGetp
53b0: 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a  agesize(void);..
53c0: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
53d0: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
53e0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
53f0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
5400: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
5410: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
5420: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
5430: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
5440: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
5450: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
5460: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
5470: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
5480: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
5490: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
54a0: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
54b0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
54c0: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
54d0: 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63  struct unix_sysc
54e0: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
54f0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
5500: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
5510: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5520: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
5530: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
5540: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
5550: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
5560: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
5570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5580: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
5590: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
55a0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
55b0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
55c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
55d0: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70  call_ptr)posixOp
55e0: 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  en,  0  },.#defi
55f0: 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28  ne osOpen      (
5600: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
5610: 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79  ar*,int,int))aSy
5620: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
5630: 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c  t)..  { "close",
5640: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5650: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f  _syscall_ptr)clo
5660: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
5670: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
5680: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
5690: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
56a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
56b0: 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ess",       (sql
56c0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
56d0: 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20  )access,     0  
56e0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63  },.#define osAcc
56f0: 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ess    ((int(*)(
5700: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
5710: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
5720: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
5730: 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  cwd",       (sql
5740: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5750: 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20  )getcwd,     0  
5760: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
5770: 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a  cwd    ((char*(*
5780: 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  )(char*,size_t))
5790: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
57a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74  rent)..  { "stat
57b0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
57c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
57d0: 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d  stat,       0  }
57e0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
57f0: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
5800: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
5810: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
5820: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
5830: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
5840: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
5850: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
5860: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
5870: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
5880: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
5890: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
58a0: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
58b0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
58c0: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
58d0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
58e0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
58f0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
5900: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
5910: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
5920: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
5930: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
5940: 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74  GPP__.  { "fstat
5950: 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
5970: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
5980: 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23  at(a,b,c)    0.#
5990: 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66  else     .  { "f
59a0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73  stat",        (s
59b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
59c0: 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30  tr)fstat,      0
59d0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
59e0: 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a  stat     ((int(*
59f0: 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61  )(int,struct sta
5a00: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e  t*))aSyscall[5].
5a10: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
5a20: 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65  ..  { "ftruncate
5a30: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
5a40: 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e  yscall_ptr)ftrun
5a50: 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65  cate,  0  },.#de
5a60: 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65  fine osFtruncate
5a70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
5a80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  f_t))aSyscall[6]
5a90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5aa0: 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20  "fcntl",        
5ab0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5ac0: 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20  _ptr)fcntl,     
5ad0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5ae0: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
5af0: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
5b00: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
5b10: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
5b20: 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  d",         (sql
5b30: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5b40: 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20  )read,       0  
5b50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
5b60: 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  d      ((ssize_t
5b70: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
5b80: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38  ze_t))aSyscall[8
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
5bb0: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
5bc0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
5bd0: 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  LE.  { "pread", 
5be0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5bf0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61  syscall_ptr)prea
5c00: 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  d,      0  },.#e
5c10: 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  lse.  { "pread",
5c20: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5c30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
5c40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
5c50: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
5c60: 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a  Pread     ((ssiz
5c70: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
5c80: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61  ,size_t,off_t))a
5c90: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
5ca0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5cb0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
5cc0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
5cd0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5ce0: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c  all_ptr)pread64,
5cf0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
5d00: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
5d10: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5d20: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
5d30: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
5d40: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
5d50: 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d64   ((ssize_t(
5d60: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
5d70: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
5d80: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
5d90: 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20  )..  { "write", 
5da0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5db0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74  syscall_ptr)writ
5dc0: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
5dd0: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20  efine osWrite   
5de0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
5df0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
5e00: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
5e10: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
5e20: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
5e30: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
5e40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
5e50: 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65  TYLE.  { "pwrite
5e60: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5e70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
5e80: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
5e90: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
5ea0: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
5eb0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
5ec0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
5ed0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5ee0: 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73  osPwrite    ((ss
5ef0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
5f00: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
5f10: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
5f30: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65  scall[12].pCurre
5f40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5f50: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
5f60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
5f70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5f80: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c  ll_ptr)pwrite64,
5f90: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
5fa0: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
5fb0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5fc0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
5fd0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
5fe0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
5ff0: 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e64  ((ssize_t(*
6000: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
6010: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
6020: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
6030: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
6040: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
6050: 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20  { "fchmod",     
6060: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6070: 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20  ll_ptr)fchmod,  
6080: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
6090: 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69   osFchmod    ((i
60a0: 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74  nt(*)(int,mode_t
60b0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
60c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
60d0: 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
60e0: 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
60f0: 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
6100: 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61  ATE.  { "falloca
6110: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
6120: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
6130: 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30  ix_fallocate,  0
6140: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
6150: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
6160: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6170: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
6180: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6190: 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f  .#define osFallo
61a0: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
61b0: 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61  t,off_t,off_t))a
61c0: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
61d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69  rent)..  { "unli
61e0: 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  nk",       (sqli
61f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6200: 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20  unlink,         
6210: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6220: 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74  sUnlink    ((int
6230: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
6240: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
6250: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70  urrent)..  { "op
6260: 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20  enDirectory",   
6270: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6280: 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74  l_ptr)openDirect
6290: 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ory,      0 },.#
62a0: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72  define osOpenDir
62b0: 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28  ectory ((int(*)(
62c0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
62d0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70  ))aSyscall[17].p
62e0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
62f0: 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  kdir",        (s
6300: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6310: 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20  tr)mkdir,       
6320: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6330: 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69   osMkdir     ((i
6340: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6350: 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  *,mode_t))aSysca
6360: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
6370: 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20  ..  { "rmdir",  
6380: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6390: 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72  yscall_ptr)rmdir
63a0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
63b0: 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72  .#define osRmdir
63c0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
63d0: 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63  nst char*))aSysc
63e0: 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74  all[19].pCurrent
63f0: 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  )..  { "fchown",
6400: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6410: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
6420: 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d  xFchown,     0 }
6430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f  ,.#define osFcho
6440: 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  wn    ((int(*)(i
6450: 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29  nt,uid_t,gid_t))
6460: 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75  aSyscall[20].pCu
6470: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
6480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6490: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
64a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
64b0: 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20    { "mmap",     
64c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
64d0: 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20  ll_ptr)mmap,    
64e0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
64f0: 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  Mmap ((void*(*)(
6500: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74  void*,size_t,int
6510: 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29  ,int,int,off_t))
6520: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
6530: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e  rrent)..  { "mun
6540: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
6550: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6560: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
6570: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6580: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
6590: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
65a0: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
65b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
65c0: 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72  E_MREMAP.  { "mr
65d0: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
65e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
65f0: 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20  r)mremap,       
6600: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6610: 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20  { "mremap",     
6620: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6630: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6640: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6650: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72  dif.#define osMr
6660: 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  emap ((void*(*)(
6670: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a  void*,size_t,siz
6680: 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  e_t,int,...))aSy
6690: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
66a0: 6e 74 29 0a 20 20 7b 20 22 67 65 74 70 61 67 65  nt).  { "getpage
66b0: 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33  size",  (sqlite3
66c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69  _syscall_ptr)uni
66d0: 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20  xGetpagesize, 0 
66e0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
66f0: 70 61 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a  pagesize ((int(*
6700: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
6710: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
6720: 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e  #endif..}; /* En
6730: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
6740: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
6750: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
6760: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
6770: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
6780: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
6790: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
67a0: 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20  * "unix" VFSes. 
67b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
67c0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
67d0: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
67e0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
67f0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
6800: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
6810: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
6820: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
6830: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
6840: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6850: 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43  t unixSetSystemC
6860: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
6870: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
6880: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
6890: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
68a0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
68b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
68c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
68d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
68e0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
68f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6900: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
6910: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
6920: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
6930: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
6940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
6950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
6960: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
6970: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6980: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
6990: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
69a0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
69b0: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
69c0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
69d0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
69e0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
69f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
6a00: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
6a10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
6a20: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
6a30: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
6a40: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
6a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
6a60: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
6a80: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6a90: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
6aa0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
6ab0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6ac0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
6ad0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
6ae0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
6af0: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
6b00: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
6b10: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
6b20: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
6b30: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
6b40: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
6b50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6b60: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
6b70: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
6b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
6b90: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
6ba0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
6bb0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
6bc0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
6bd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6be0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
6bf0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6c00: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
6c10: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
6c20: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
6c30: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6c40: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
6c50: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
6c60: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
6c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6c80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6c90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6ca0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
6cb0: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
6cc0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
6cd0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
6ce0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
6cf0: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
6d00: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
6d10: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
6d20: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
6d30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
6d40: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
6d50: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
6d60: 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79  ll_ptr unixGetSy
6d70: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
6d80: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
6d90: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
6da0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
6db0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
6dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6dd0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
6de0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
6df0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
6e00: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
6e10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
6e20: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
6e30: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
6e40: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
6e50: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
6e60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6e70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6e80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
6e90: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
6ea0: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
6eb0: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
6ec0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
6ed0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
6ee0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
6ef0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
6f00: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
6f10: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
6f20: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
6f30: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
6f40: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
6f50: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
6f60: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
6f70: 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
6f80: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
6f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6fa0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
6fb0: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
6fc0: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
6fd0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
6fe0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6ff0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
7000: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7010: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7020: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7030: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7040: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
7050: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
7060: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
7070: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
7080: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
7090: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
70a0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
70b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
70c0: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70  .** Do not accep
70d0: 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72  t any file descr
70e0: 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20  iptor less than 
70f0: 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f  this value, in o
7100: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a  rder to avoid.**
7110: 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73   opening databas
7120: 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c  e file using fil
7130: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
7140: 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20  at are commonly 
7150: 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61  used for .** sta
7160: 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74  ndard input, out
7170: 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a  put, and error..
7180: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7190: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
71a0: 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69  ESCRIPTOR.# defi
71b0: 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ne SQLITE_MINIMU
71c0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
71d0: 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  R 3.#endif../*.*
71e0: 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e  * Invoke open().
71f0: 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65    Do so multiple
7200: 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74   times, until it
7210: 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73   either succeeds
7220: 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72   or.** fails for
7230: 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68   some reason oth
7240: 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a  er than EINTR..*
7250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
7260: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22   creation mode "
7270: 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65 74  m" is 0 then set
7280: 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
7290: 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65  lt for.** SQLite
72a0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
72b0: 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  s SQLITE_DEFAULT
72c0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
72d0: 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30  S (normally.** 0
72e0: 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64  644) as modified
72f0: 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 75   by the system u
7300: 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e  mask.  If m is n
7310: 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61  ot 0, then.** ma
7320: 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  ke the file crea
7330: 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61  tion mode be exa
7340: 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20  ctly m ignoring 
7350: 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  the umask..**.**
7360: 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72   The m parameter
7370: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72   will be non-zer
7380: 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61  o only when crea
7390: 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72  ting -wal, -jour
73a0: 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d  nal,.** and -shm
73b0: 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74   files.  We want
73c0: 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20   those files to 
73d0: 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74  have *exactly* t
73e0: 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69  he same.** permi
73f0: 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20  ssions as their 
7400: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
7410: 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  e, unadulterated
7420: 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
7430: 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69  * In that way, i
7440: 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
7450: 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f  e is -rw-rw-rw o
7460: 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64  r -rw-rw-r-, and
7470: 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f   a.** transactio
7480: 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65  n crashes and le
7490: 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20  aves behind hot 
74a0: 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61  journals, then a
74b0: 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  ny.** process th
74c0: 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72  at is able to wr
74d0: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
74e0: 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65  ase will also be
74f0: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f   able to.** reco
7500: 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ver the hot jour
7510: 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nals..*/.static 
7520: 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  int robust_open(
7530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
7540: 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b  nt f, mode_t m){
7550: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64  .  int fd;.  mod
7560: 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a  e_t m2 = m ? m :
7570: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
7580: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
7590: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69  ;.  while(1){.#i
75a0: 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  f defined(O_CLOE
75b0: 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73  XEC).    fd = os
75c0: 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58  Open(z,f|O_CLOEX
75d0: 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20  EC,m2);.#else.  
75e0: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
75f0: 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20  f,m2);.#endif.  
7600: 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
7610: 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
7620: 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INTR ) continue;
7630: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7640: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d    }.    if( fd>=
7650: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
7660: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29  ILE_DESCRIPTOR )
7670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c   break;.    osCl
7680: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c  ose(fd);.    sql
7690: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
76a0: 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20  WARNING, .      
76b0: 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65 6d            "attem
76c0: 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c  pt to open \"%s\
76d0: 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72 69  " as file descri
76e0: 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29  ptor %d", z, fd)
76f0: 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20  ;.    fd = -1;. 
7700: 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f     if( osOpen("/
7710: 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29  dev/null", f, m)
7720: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  <0 ) break;.  }.
7730: 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
7740: 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
7750: 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
7760: 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20   statbuf;.      
7770: 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20  if( osFstat(fd, 
7780: 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20  &statbuf)==0 .  
7790: 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66 2e       && statbuf.
77a0: 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20  st_size==0.     
77b0: 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73 74    && (statbuf.st
77c0: 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a  _mode&0777)!=m .
77d0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
77e0: 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29   osFchmod(fd, m)
77f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7800: 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43  #if defined(FD_C
7810: 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65 66  LOEXEC) && (!def
7820: 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20  ined(O_CLOEXEC) 
7830: 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29  || O_CLOEXEC==0)
7840: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
7850: 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74   F_SETFD, osFcnt
7860: 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
7870: 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
7880: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
7890: 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn fd;.}../*.*
78a0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
78b0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
78c0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
78d0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
78e0: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
78f0: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
7900: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
7910: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
7920: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7930: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
7940: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
7950: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
7960: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
7970: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
7980: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
7990: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
79a0: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
79b0: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
79c0: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
79d0: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
79e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
79f0: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
7a00: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
7a10: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
7a20: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
7a30: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
7a40: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
7a50: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
7a60: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
7a70: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
7a80: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
7a90: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
7aa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
7ab0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
7ac0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7ad0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
7ae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
7af0: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
7b00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
7b10: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
7b20: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
7b30: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
7b40: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
7b50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
7b60: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
7b70: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
7b80: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7b90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
7ba0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
7bb0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7bc0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
7bd0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
7be0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
7bf0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
7c00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48  E_DEBUG)./*.** H
7c10: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
7c20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
7c30: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
7c40: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
7c50: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
7c60: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
7c70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
7c80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
7c90: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
7ca0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
7cb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7cc0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
7cd0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
7ce0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
7cf0: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
7d00: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
7d10: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
7d20: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
7d30: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
7d40: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
7d50: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
7d60: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
7d70: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
7d80: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
7d90: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
7da0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
7db0: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
7dc0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
7dd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
7de0: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
7df0: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
7e00: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
7e10: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
7e20: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
7e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7e40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
7e50: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
7e60: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
7e70: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
7e80: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
7e90: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
7ea0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
7eb0: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
7ec0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
7ed0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
7ee0: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
7ef0: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
7f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7f10: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
7f20: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
7f30: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
7f40: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
7f50: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
7f60: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
7f70: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
7f80: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
7f90: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
7fa0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
7fb0: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
7fc0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
7fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f  }else{.    s = o
7fe0: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
7ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
8000: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
8010: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
8020: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
8030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
8040: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
8050: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
8060: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
8070: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
8080: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
8090: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
80a0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
80b0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
80c0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
80d0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
80e0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
80f0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
8100: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
8110: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
8120: 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74   );.  s = osFcnt
8130: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
8140: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
8150: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
8160: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
8170: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
8180: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
8190: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
81a0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
81b0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
81c0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
81d0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
81e0: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d  d, s);.  if( s==
81f0: 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45  (-1) && op==F_SE
8200: 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70  TLK && (p->l_typ
8210: 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d  e==F_RDLCK || p-
8220: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
8230: 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
8240: 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32  flock l2;.    l2
8250: 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e   = *p;.    osFcn
8260: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
8270: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
8280: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
8290: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
82a0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
82b0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
82c0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
82d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
82e0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
82f0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
8300: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
8310: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
8320: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8330: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
8340: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8350: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
8360: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
8370: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
8380: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
8390: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
83a0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
83b0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
83c0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
83d0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
83e0: 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20  urn s;.}.#undef 
83f0: 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20  osFcntl.#define 
8400: 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  osFcntl lockTrac
8410: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
8420: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
8430: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74  ../*.** Retry ft
8440: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20  runcate() calls 
8450: 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f  that fail due to
8460: 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63   EINTR.*/.static
8470: 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75   int robust_ftru
8480: 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c  ncate(int h, sql
8490: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a  ite3_int64 sz){.
84a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
84b0: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
84c0: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
84d0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
84e0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
84f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
8500: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
8510: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
8520: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
8530: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
8540: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
8550: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
8560: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
8570: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
8580: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
8590: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
85a0: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
85b0: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
85c0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
85d0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
85e0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
85f0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
8600: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
8610: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
8620: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
8630: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
8640: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
8650: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
8660: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
8670: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
8680: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
8690: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
86a0: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
86b0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
86c0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
86d0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
86e0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
86f0: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
8700: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
8710: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
8720: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
8730: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
8740: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
8750: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
8760: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
8770: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
8780: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
8790: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
87a0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
87b0: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
87c0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
87d0: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
87e0: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
87f0: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
8800: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
8810: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8820: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
8830: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
8840: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
8850: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
8860: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
8870: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
8880: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
8890: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
88a0: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
88b0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
88c0: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
88d0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
88e0: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
88f0: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
8900: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
8910: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
8920: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
8930: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
8940: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
8950: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
8960: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
8970: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
8980: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
8990: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
89a0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
89b0: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
89c0: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
89d0: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
89e0: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
89f0: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
8a00: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
8a10: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
8a20: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
8a30: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
8a40: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
8a50: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
8a60: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
8a70: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
8a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8a90: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
8aa0: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
8ab0: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
8ac0: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
8ad0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
8ae0: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
8af0: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
8b00: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
8b10: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8b20: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20  R_LOCK) || .    
8b30: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
8b40: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
8b50: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  _UNLOCK) || .   
8b60: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
8b70: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8b80: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
8b90: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
8ba0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8bb0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8bc0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
8bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8be0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
8bf0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
8c00: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
8c10: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
8c20: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
8c30: 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20    /* EDEADLK is 
8c40: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
8c50: 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c   a call to fcntl
8c60: 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61  (F_SETLKW) is ma
8c70: 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69  de. And.  ** thi
8c80: 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d  s module never m
8c90: 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c  akes such a call
8ca0: 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69  . And the code i
8cb0: 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20  n SQLite itself 
8cc0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68  .  ** asserts th
8cd0: 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  at SQLITE_IOERR_
8ce0: 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72  BLOCKED is never
8cf0: 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74   returned. For t
8d00: 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a  hese reasons.  *
8d10: 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20 61  * this case is a
8d20: 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
8d30: 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  t. If the system
8d40: 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20   does set errno 
8d50: 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a  to EDEADLK,.  **
8d60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c   the default SQL
8d70: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f  ITE_IOERR_XXX co
8d80: 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  de will be retur
8d90: 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ned. */.#if 0.  
8da0: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
8db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8dc0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23  IOERR_BLOCKED;.#
8dd0: 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45  endif.    .#if E
8de0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
8df0: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
8e00: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
8e10: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
8e20: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
8e30: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
8e40: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
8e50: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
8e60: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
8e70: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
8e80: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
8e90: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
8ea0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
8eb0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
8ec0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
8ed0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
8ee0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
8ef0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
8f00: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
8f10: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
8f20: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
8f30: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
8f40: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
8f50: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
8f60: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
8f70: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
8f80: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
8f90: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
8fa0: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fc0: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
8fd0: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
8fe0: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
8ff0: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
9000: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
9010: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
9020: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
9030: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
9040: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
9050: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
9060: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
9070: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
9080: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
90f0: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
9100: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
9110: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
9120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
9130: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
9140: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
9150: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
9160: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
9170: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
9180: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
9190: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
91a0: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
91b0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
91c0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
91d0: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
91e0: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
91f0: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
9200: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
9210: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
9220: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
9230: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
9240: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
9250: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
9260: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
9270: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
9280: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
9290: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
92a0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
92b0: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
92c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
92d0: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
92e0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
92f0: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
9300: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
9310: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
9320: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
9330: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
9340: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
9350: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
9360: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
9370: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
9380: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
9390: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
93a0: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
93b0: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
93c0: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
93d0: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
93e0: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
93f0: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
9400: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
9410: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9420: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
9430: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
9440: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
9450: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
9460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9470: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
9480: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
9490: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
94c0: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
94d0: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
94e0: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
94f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
9500: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
9510: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
9520: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
9530: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
9540: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
9550: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
9560: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
9570: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
9580: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
9590: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
95a0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
95b0: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
95c0: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
95d0: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
95e0: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
95f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
9600: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
9610: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
9620: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
9630: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
9640: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
9650: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
9660: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
9670: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
9680: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
9690: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
96a0: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
96b0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
96c0: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
96d0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
96e0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
96f0: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
9700: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9710: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
9720: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
9730: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
9740: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
9750: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
9760: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
9770: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
9780: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
9790: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
97a0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
97b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
97c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
97d0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
97e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
97f0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
9800: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
9810: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
9820: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
9830: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9840: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9850: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
9860: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
9870: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
9880: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
9890: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
98a0: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
98b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
98c0: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
98d0: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
98e0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
98f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9900: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
9910: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
9920: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
9930: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
9940: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
9950: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
9960: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
9970: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
9980: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
9990: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
99a0: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
99b0: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
99c0: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
99d0: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
99e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
99f0: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
9a00: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
9a10: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
9a20: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
9a30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
9a40: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
9a50: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
9a60: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
9a70: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
9a80: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
9a90: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
9aa0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
9ab0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
9ac0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9ad0: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
9ae0: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
9af0: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
9b00: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
9b10: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
9b20: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
9b30: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
9b40: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
9b50: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9b60: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
9b70: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9b80: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
9b90: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9bc0: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
9bd0: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
9be0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
9bf0: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
9c00: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
9c10: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
9c20: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
9c30: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
9c40: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
9c50: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
9c60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
9c70: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
9c80: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
9c90: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
9ca0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
9cb0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
9cc0: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
9cd0: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
9ce0: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
9cf0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
9d00: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
9d10: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
9d20: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
9d30: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
9d40: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
9d50: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
9d60: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
9d70: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
9d80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9d90: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
9da0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
9db0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9dc0: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
9dd0: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
9de0: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
9df0: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
9e00: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
9e10: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
9e20: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
9e30: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
9e40: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
9e50: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
9e60: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
9e70: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
9e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9e90: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
9ea0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
9eb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
9ec0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
9ed0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
9ee0: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
9ef0: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
9f00: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
9f10: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
9f20: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
9f30: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
9f40: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
9f50: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
9f60: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
9f70: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
9f80: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
9f90: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9fa0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
9fb0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
9fc0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
9fd0: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
9fe0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
9ff0: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
a000: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
a010: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
a020: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
a030: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
a040: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
a050: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
a060: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
a070: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
a080: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
a090: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
a0a0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
a0b0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a0c0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
a0d0: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
a0e0: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
a0f0: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
a100: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
a110: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
a120: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
a130: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
a140: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
a150: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a160: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
a170: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
a180: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
a190: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
a1a0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
a1b0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
a1c0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
a1d0: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
a1e0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
a1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a230: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
a240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
a290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2a0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
a2b0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
a2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
a2e0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
a2f0: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
a300: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
a310: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
a320: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
a330: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
a340: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
a350: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
a360: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
a370: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
a380: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
a390: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
a3a0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
a3b0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
a3c0: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
a3d0: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
a3e0: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
a3f0: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
a400: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
a410: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
a420: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
a430: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
a440: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a450: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
a460: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
a470: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
a480: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
a490: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
a4a0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
a4b0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
a4c0: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
a4d0: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
a4e0: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
a4f0: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
a500: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
a510: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
a520: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
a530: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
a540: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
a550: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
a560: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
a570: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
a580: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
a590: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
a5a0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
a5b0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
a5c0: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
a5d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
a5e0: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
a5f0: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
a600: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
a610: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
a620: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
a630: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
a640: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
a650: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
a660: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
a670: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
a680: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
a690: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
a6a0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
a6b0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
a6c0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
a6d0: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
a6e0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
a6f0: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
a700: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
a710: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
a720: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
a730: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
a740: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
a750: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
a760: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
a770: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
a780: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
a790: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
a7a0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
a7b0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
a7c0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
a7d0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
a7e0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
a7f0: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
a800: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
a810: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
a820: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
a830: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
a840: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
a850: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
a860: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
a870: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
a880: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
a890: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
a8a0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
a8b0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
a8c0: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
a8d0: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
a8e0: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
a8f0: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
a900: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
a910: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
a920: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
a930: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
a940: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
a950: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
a960: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
a970: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
a980: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
a990: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
a9a0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
a9b0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
a9c0: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
a9d0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
a9e0: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
a9f0: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
aa00: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
aa10: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
aa20: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
aa30: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
aa40: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
aa50: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
aa60: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
aa70: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
aa80: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
aa90: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
aaa0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
aab0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
aac0: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
aad0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
aae0: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
aaf0: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
ab00: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
ab10: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
ab20: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
ab30: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
ab40: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
ab50: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
ab60: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
ab70: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
ab80: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
ab90: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
aba0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
abb0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
abc0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
abd0: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
abe0: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
abf0: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
ac00: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
ac10: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
ac20: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
ac30: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
ac40: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
ac50: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
ac60: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
ac70: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
ac80: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
ac90: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
aca0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
acb0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
acc0: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
acd0: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
ace0: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
acf0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
ad00: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
ad10: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
ad20: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
ad30: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
ad40: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
ad50: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
ad60: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
ad70: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
ad80: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
ad90: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
ada0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
adb0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
adc0: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
add0: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
ade0: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
adf0: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
ae00: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
ae10: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
ae20: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
ae30: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
ae40: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
ae50: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
ae60: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
ae70: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
ae80: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
ae90: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
aea0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
aeb0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
aec0: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
aed0: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
aee0: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
aef0: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
af00: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
af10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
af20: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
af30: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
af40: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
af50: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
af60: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
af70: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
af80: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
af90: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
afa0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
afb0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
afc0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
afd0: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
afe0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
aff0: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
b000: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
b010: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
b020: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
b030: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
b040: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
b050: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
b060: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
b070: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
b080: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
b090: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
b0a0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
b0b0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
b0c0: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
b0d0: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
b0e0: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
b0f0: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
b100: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
b110: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
b120: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
b130: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
b140: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
b150: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
b160: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
b170: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
b180: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
b190: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
b1a0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
b1b0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
b1c0: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
b1d0: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
b1e0: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
b1f0: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
b200: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
b210: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
b220: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
b230: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
b240: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
b250: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
b260: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
b270: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
b280: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
b290: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
b2a0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
b2b0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
b2c0: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
b2d0: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
b2e0: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
b2f0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
b300: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
b310: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
b320: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
b330: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
b340: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
b350: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
b360: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
b370: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
b380: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
b390: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
b3a0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
b3b0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
b3c0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
b3d0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
b3e0: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
b3f0: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
b400: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
b410: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
b420: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
b430: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
b440: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
b450: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
b460: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
b470: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
b480: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
b490: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
b4a0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
b4b0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
b4c0: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
b4d0: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
b4e0: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
b4f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
b500: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
b510: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
b520: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
b530: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
b540: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
b550: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
b560: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
b570: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
b580: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
b590: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
b5a0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
b5b0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
b5c0: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
b5d0: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
b5e0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
b5f0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
b600: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b620: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
b630: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
b640: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
b650: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
b660: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
b670: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
b680: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
b690: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
b6a0: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
b6b0: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
b6c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
b6d0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
b6e0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
b6f0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
b700: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
b710: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
b720: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
b730: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
b740: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
b750: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
b760: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
b770: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
b780: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
b790: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
b7a0: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
b7b0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
b7c0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
b7d0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
b7e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
b7f0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
b800: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
b810: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
b820: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
b830: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
b840: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
b850: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
b860: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
b870: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
b880: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
b890: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
b8a0: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
b8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b8c0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
b8d0: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e  cks held */.  un
b8e0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
b8f0: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  eLock;        /*
b900: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
b910: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
b920: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73  CK etc. */.  uns
b930: 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63  igned char bProc
b940: 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  essLock;     /* 
b950: 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f  An exclusive pro
b960: 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c  cess lock is hel
b970: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b9a0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
b9b0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
b9c0: 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
b9d0: 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
b9e0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
b9f0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
ba00: 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20  with this inode 
ba10: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20  */.  int nLock; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ba40: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69  f outstanding fi
ba50: 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e  le locks */.  Un
ba60: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
ba70: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sed;          /*
ba80: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
ba90: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
baa0: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
bab0: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
bac0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
bad0: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
bae0: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
baf0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
bb00: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
bb10: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
bb20: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66  ly linked */.#if
bb30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
bb40: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75  OCKING_STYLE.  u
bb50: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
bb60: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
bb70: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
bb80: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
bb90: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
bba0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
bbb0: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
bbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
bbd0: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
bbe0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
bbf0: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
bc00: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
bc10: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
bc20: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
bc30: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
bc40: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
bc50: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
bc60: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
bc70: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
bc80: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
bc90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
bca0: 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c  nixLogError_x(),
bcb0: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
bcc0: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
bcd0: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
bce0: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
bcf0: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
bd00: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bd10: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
bd20: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
bd30: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
bd40: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
bd50: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
bd60: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
bd70: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
bd80: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
bd90: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
bda0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
bdb0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
bdc0: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
bdd0: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
bde0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
bdf0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
be00: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
be10: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
be20: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
be30: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
be40: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
be50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
be60: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
be70: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
be80: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
be90: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
bea0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
beb0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
bec0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
bed0: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
bee0: 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f  n") and the asso
bef0: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
bf00: 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61  em path,.** if a
bf10: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75  ny..*/.#define u
bf20: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  nixLogError(a,b,
bf30: 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  c)     unixLogEr
bf40: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
bf50: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
bf60: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
bf70: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
bf80: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
bf90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
bfa0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
bfb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bfc0: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
bfd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
bfe0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
bff0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
c000: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c020: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
c030: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
c040: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
c070: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
c080: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
c090: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
c0a0: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61          /* Messa
c0c0: 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  ge from strerror
c0d0: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
c0e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f   */.  int iErrno
c0f0: 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20   = errno;       
c100: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73        /* Saved s
c110: 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d  yscall error num
c120: 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ber */..  /* If 
c130: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68  this is not a th
c140: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28  readsafe build (
c150: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
c160: 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a  E==0), then use.
c170: 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f    ** the strerro
c180: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
c190: 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e  obtain the human
c1a0: 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20  -readable error 
c1b0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75  message.  ** equ
c1c0: 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f  ivalent to errno
c1d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
c1e0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20   strerror_r().. 
c1f0: 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f   */ .#if SQLITE_
c200: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
c210: 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52  fined(HAVE_STRER
c220: 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45  ROR_R).  char aE
c230: 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74  rr[80];.  memset
c240: 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (aErr, 0, sizeof
c250: 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20  (aErr));.  zErr 
c260: 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66  = aErr;..  /* If
c270: 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52   STRERROR_R_CHAR
c280: 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63  _P (set by autoc
c290: 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20  onf scripts) or 
c2a0: 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66  __USE_GNU is def
c2b0: 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d  ined,.  ** assum
c2c0: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
c2d0: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47  m provides the G
c2e0: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
c2f0: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a  rerror_r() that.
c300: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
c310: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
c320: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
c330: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
c340: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
c350: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
c360: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
c370: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
c380: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
c390: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
c3a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
c3b0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
c3c0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
c3d0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
c3e0: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
c3f0: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
c400: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
c410: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
c420: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
c430: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
c440: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
c450: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
c460: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
c470: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
c480: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
c490: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
c4a0: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
c4b0: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
c4c0: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
c4d0: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
c4e0: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
c4f0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
c500: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
c510: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
c520: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
c530: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
c540: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
c550: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
c560: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
c570: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
c580: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
c590: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
c5a0: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
c5b0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c5c0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
c5d0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
c5e0: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
c5f0: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
c600: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
c610: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
c620: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
c630: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
c640: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
c650: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
c660: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
c670: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
c680: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
c690: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
c6a0: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
c6b0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
c6c0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
c6d0: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
c6e0: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
c6f0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
c700: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
c710: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
c720: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
c730: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
c740: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
c750: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
c760: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
c770: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
c780: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
c790: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
c7a0: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
c7b0: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
c7c0: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
c7d0: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
c7e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
c7f0: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
c800: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
c810: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
c820: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
c830: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
c840: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
c850: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c860: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
c870: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
c880: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
c890: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
c8a0: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
c8b0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
c8c0: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
c8d0: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
c8e0: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
c8f0: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
c900: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
c910: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
c920: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
c930: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
c940: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
c950: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
c960: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
c970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c980: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
c990: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
c9a0: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
c9b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
c9c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e  toreLastErrno(un
c9d0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
c9e0: 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69  nt error){.  pFi
c9f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ca00: 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  error;.}../*.** 
ca10: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
ca20: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
ca30: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
ca40: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
ca50: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
ca60: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
ca70: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
ca80: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
ca90: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
caa0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
cab0: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
cac0: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
cad0: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
cae0: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
caf0: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
cb00: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
cb10: 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f   p->pNext;.#if O
cb20: 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
cb30: 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28  SE_IOERR.    if(
cb40: 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b   close(p->fd) ){
cb50: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
cb60: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
cb70: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
cb80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
cb90: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
cba0: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
cbb0: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
cbc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cbd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
cbe0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
cbf0: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
cc00: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
cc10: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
cc20: 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64  e3_free(p);.#end
cc30: 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  if.  }.  pInode-
cc40: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
cc50: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
cc60: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
cc70: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
cc80: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
cc90: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
cca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
ccb0: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
ccc0: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
ccd0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
cce0: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
ccf0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
cd00: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
cd10: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
cd20: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
cd30: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cd40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
cd50: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
cd60: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
cd70: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
cd80: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
cd90: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
cda0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
cdb0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
cdc0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
cdd0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
cde0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
cdf0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
ce00: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
ce10: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
ce20: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
ce30: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
ce40: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
ce50: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
ce60: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
ce70: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
ce80: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
ce90: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
cea0: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
ceb0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
cec0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
ced0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
cee0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
cef0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
cf00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cf10: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
cf20: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
cf30: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
cf40: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
cf50: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
cf60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
cf70: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
cf80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
cf90: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
cfa0: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
cfb0: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
cfc0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
cfd0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
cfe0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
cff0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
d000: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
d010: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
d020: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
d030: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
d040: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
d050: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
d060: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
d070: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
d080: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
d090: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
d0a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d0b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
d0c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
d0d0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d0e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
d0f0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
d100: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
d110: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
d120: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
d130: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
d140: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
d150: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
d160: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
d170: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
d180: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
d190: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
d1a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
d1d0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
d1e0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
d210: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
d220: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
d230: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
d240: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
d250: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
d260: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
d270: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
d280: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
d290: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
d2a0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
d2b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d2c0: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
d2d0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
d2e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
d2f0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
d300: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
d310: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
d320: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
d330: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
d340: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
d350: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
d360: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
d370: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
d380: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
d390: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
d3a0: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
d3b0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
d3c0: 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
d3d0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
d3e0: 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45  no);.#ifdef EOVE
d3f0: 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46  RFLOW.    if( pF
d400: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
d410: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
d420: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
d430: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
d440: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
d450: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41  .  }..#ifdef __A
d460: 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f  PPLE__.  /* On O
d470: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
d480: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
d490: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
d4a0: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
d4b0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
d4c0: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
d4d0: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
d4e0: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
d4f0: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
d500: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
d510: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
d520: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
d530: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
d540: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
d550: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
d560: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
d570: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
d580: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
d590: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
d5a0: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
d5b0: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
d5c0: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
d5d0: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
d5e0: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
d5f0: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
d600: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
d610: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
d620: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
d630: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
d640: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
d650: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
d660: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
d670: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
d680: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
d690: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
d6a0: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
d6b0: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
d6c0: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
d6d0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28  .st_size==0 && (
d6e0: 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
d6f0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
d700: 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a  IS_MSDOS)!=0 ){.
d710: 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57      do{ rc = osW
d720: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
d730: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
d740: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
d750: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20  ;.    if( rc!=1 
d760: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
d770: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
d780: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
d790: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
d7b0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
d7c0: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
d7d0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rc!=0 ){.      s
d7e0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d7f0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
d800: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d810: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
d820: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
d830: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
d840: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
d850: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
d860: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
d870: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
d880: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
d890: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
d8a0: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
d8b0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
d8c0: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
d8d0: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
d8e0: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
d8f0: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
d900: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
d910: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
d920: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
d930: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
d940: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
d950: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
d960: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
d970: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
d980: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
d990: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
d9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d9b0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
d9c0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
d9d0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
d9e0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
d9f0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
da00: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
da10: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
da20: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
da30: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
da40: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
da50: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
da60: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
da70: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
da80: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
da90: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
daa0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
dab0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
dac0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
dad0: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
dae0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
daf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
db00: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46  eturn TRUE if pF
db10: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e  ile has been ren
db20: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
db30: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69   since it was fi
db40: 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  rst opened..*/.s
db50: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61  tatic int fileHa
db60: 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20  sMoved(unixFile 
db70: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
db80: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65  t stat buf;.  re
db90: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
dba0: 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  de!=0 &&.       
dbb0: 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d    (osStat(pFile-
dbc0: 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30  >zPath, &buf)!=0
dbd0: 20 7c 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d   || buf.st_ino!=
dbe0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
dbf0: 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 7d 0a 0a 0a  ileId.ino);.}...
dc00: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
dc10: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
dc20: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
dc30: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
dc40: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
dc50: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
dc60: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
dc70: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
dc80: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
dc90: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
dca0: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
dcb0: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
dcc0: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
dcd0: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
dce0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
dcf0: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
dd00: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
dd10: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
dd20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
dd30: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
dd40: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
dd50: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
dd60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
dd70: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
dd80: 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  & UNIXFILE_WARNE
dd90: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  D ){.    /* One 
dda0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66  or more of the f
ddb0: 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67  ollowing warning
ddc0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
ddd0: 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20  een issued.  Do 
dde0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61  not.    ** repea
ddf0: 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74  t them so as not
de00: 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20   to clutter the 
de10: 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20  error log */.   
de20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
de30: 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c  c = osFstat(pFil
de40: 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69  e->h, &buf);.  i
de50: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
de60: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
de70: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e  TE_WARNING, "can
de80: 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c  not fstat db fil
de90: 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  e %s", pFile->zP
dea0: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
deb0: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
dec0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
ded0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
dee0: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
def0: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
df00: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
df10: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
df30: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
df40: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
df50: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
df60: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
df70: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
df80: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
df90: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
dfa0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
dfb0: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
dfc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
dfd0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
dfe0: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
dff0: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
e000: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e010: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
e020: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
e030: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
e040: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
e050: 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
e060: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
e070: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e080: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61  NING, "file rena
e090: 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20  med while open: 
e0a0: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
e0b0: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
e0c0: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
e0d0: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
e0e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
e0f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e100: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
e110: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
e120: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
e130: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
e140: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
e150: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
e160: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
e170: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
e180: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
e190: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
e1a0: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
e1b0: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
e1c0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
e1d0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
e1e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
e1f0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
e200: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
e210: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
e220: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
e230: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
e240: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e250: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
e260: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e270: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
e280: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
e290: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e2a0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
e2b0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
e2c0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
e2d0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e2e0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
e2f0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e300: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
e310: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
e320: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
e330: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
e340: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
e350: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
e360: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
e370: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
e380: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
e390: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
e3a0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
e3b0: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
e3c0: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
e3d0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
e3e0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
e3f0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
e400: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
e410: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
e420: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
e430: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
e440: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
e450: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
e460: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e470: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e480: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e490: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
e4a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e4b0: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
e4c0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
e4d0: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
e4e0: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
e4f0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20 4f   &lock) ){.#if O
e500: 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
e510: 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
e520: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
e530: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
e540: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e550: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e560: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
e570: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
e580: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
e590: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
e5a0: 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20  rrno);.#else.   
e5b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e5c0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
e5d0: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  EDLOCK;.      st
e5e0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
e5f0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e 64  le, errno);.#end
e600: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  if.    } else if
e610: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
e620: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
e630: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
e640: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
e650: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
e660: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e670: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
e680: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
e690: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
e6a0: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
e6b0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
e6c0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
e6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
e6e0: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
e6f0: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
e700: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
e710: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
e720: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
e730: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
e740: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
e750: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
e760: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
e770: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
e780: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
e790: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e7a0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
e7b0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
e7c0: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
e7d0: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
e7e0: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
e7f0: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
e800: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
e810: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
e820: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
e830: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
e840: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
e850: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
e860: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
e870: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
e880: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
e890: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
e8a0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
e8b0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
e8c0: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
e8d0: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
e8e0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
e8f0: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
e900: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
e910: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e920: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
e930: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
e940: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
e950: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
e960: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
e970: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
e980: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
e990: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
e9a0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
e9b0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
e9c0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
e9d0: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
e9e0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
e9f0: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
ea00: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
ea10: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
ea20: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
ea30: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
ea40: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
ea50: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
ea60: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
ea70: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
ea80: 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52 65   *pLock, int nRe
ea90: 74 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  try){.  int rc;.
eaa0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
eab0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
eac0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
ead0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
eae0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
eaf0: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
eb00: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
eb10: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
eb20: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
eb30: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
eb40: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
eb50: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
eb60: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
eb70: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
eb80: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
eb90: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
eba0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ebb0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
ebc0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
ebd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
ebe0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ebf0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
ec00: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ec10: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
ec20: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ec30: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
ec40: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
ec50: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
ec60: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ec70: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ec80: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
ec90: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
eca0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
ecb0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
ecc0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
ecd0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
ece0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
ecf0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ed00: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 20 20     int i = 0;   
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20     .    do {.   
ed30: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
ed40: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
ed50: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, pLock);.     
ed60: 20 69 66 28 20 72 63 20 26 26 20 6e 52 65 74 72   if( rc && nRetr
ed70: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 75 73  y ){.         us
ed80: 6c 65 65 70 28 31 30 30 20 2a 20 28 2b 2b 69 29  leep(100 * (++i)
ed90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
eda0: 77 68 69 6c 65 28 20 21 72 63 20 26 26 20 6e 52  while( !rc && nR
edb0: 65 74 72 79 2d 2d 20 29 3b 0a 20 20 7d 0a 20 20  etry-- );.  }.  
edc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
edd0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
ede0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
edf0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
ee00: 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
ee10: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
ee20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
ee30: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
ee40: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
ee50: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
ee60: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
ee70: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
ee80: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
ee90: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
eea0: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
eeb0: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
eec0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
eed0: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
eee0: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
eef0: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
ef00: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
ef10: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
ef20: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
ef30: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
ef40: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
ef50: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
ef60: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
ef70: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
ef80: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
ef90: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
efa0: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
efb0: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
efc0: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
efd0: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
efe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
eff0: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
f000: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
f010: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
f020: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f030: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f040: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
f050: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
f060: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
f070: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
f080: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f090: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
f0a0: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
f0b0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
f0c0: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
f0d0: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
f0e0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
f0f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
f100: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
f110: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
f120: 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65  eLock){.  /* The
f130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
f140: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
f150: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
f160: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
f170: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
f180: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
f190: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
f1a0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
f1b0: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
f1c0: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
f1d0: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
f1e0: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
f1f0: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
f200: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
f210: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
f220: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
f230: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
f240: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
f250: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
f260: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
f270: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
f280: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
f290: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
f2a0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
f2b0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
f2c0: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
f2d0: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
f2e0: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
f2f0: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
f300: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
f310: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
f320: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
f330: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
f340: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
f350: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
f360: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
f370: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
f380: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
f390: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
f3a0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
f3b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
f3c0: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
f3d0: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
f3e0: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
f3f0: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
f400: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
f410: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
f420: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
f430: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
f440: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
f450: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
f460: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
f470: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
f480: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
f490: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
f4a0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
f4b0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
f4c0: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
f4d0: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
f4e0: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
f4f0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
f500: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
f510: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
f520: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
f530: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
f540: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
f550: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
f560: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
f570: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
f580: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
f590: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
f5a0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
f5b0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
f5c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
f5d0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
f5e0: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
f5f0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
f600: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
f610: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
f620: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
f630: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
f640: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
f650: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
f660: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
f670: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
f680: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
f690: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
f6a0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
f6b0: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
f6c0: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
f6d0: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
f6e0: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
f6f0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
f700: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
f710: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
f720: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
f730: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
f740: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
f750: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
f760: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
f770: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
f780: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
f790: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
f7a0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
f7b0: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
f7c0: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
f7d0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
f7e0: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
f7f0: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
f800: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
f810: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
f820: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
f830: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
f840: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
f850: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
f860: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
f870: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
f880: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
f890: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
f8a0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
f8b0: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
f8c0: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
f8d0: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
f8e0: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
f8f0: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
f900: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
f910: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
f920: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
f930: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
f940: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
f950: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
f960: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
f970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
f980: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f990: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
f9a0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
f9b0: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
f9c0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
f9d0: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
f9e0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
f9f0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
fa00: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
fa10: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
fa20: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
fa30: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
fa40: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
fa50: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
fa60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
fa70: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
fa80: 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  k(pFile->pInode-
fa90: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69  >eFileLock), pFi
faa0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
fab0: 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
fac0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
fad0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
fae0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
faf0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
fb00: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
fb10: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
fb20: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
fb30: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
fb40: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
fb50: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
fb60: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
fb70: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
fb80: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
fb90: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
fba0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
fbb0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
fbc0: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
fbd0: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
fbe0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
fbf0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
fc00: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
fc10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fc20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
fc30: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
fc40: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
fc50: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
fc60: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
fc70: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
fc80: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
fc90: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
fca0: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
fcb0: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
fcc0: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
fcd0: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
fce0: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
fcf0: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
fd00: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
fd10: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
fd20: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
fd30: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
fd40: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
fd50: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
fd60: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
fd70: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
fd80: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
fd90: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
fda0: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
fdb0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
fdc0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
fdd0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
fde0: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
fdf0: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
fe00: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
fe10: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
fe20: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
fe30: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
fe40: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
fe50: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
fe60: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
fe70: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
fe80: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
fe90: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
fea0: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
feb0: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
fec0: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
fed0: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
fee0: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
fef0: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
ff00: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
ff10: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
ff20: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
ff30: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
ff40: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
ff50: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
ff60: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ff70: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
ff80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
ff90: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
ffa0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
ffb0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
ffc0: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
ffd0: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
ffe0: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
fff0: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
10000 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
10010 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
10020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
10030 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10040 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10050 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
10060 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
10070 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
10080 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10090 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
100a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
100b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
100c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
100d0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
100e0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
100f0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
10100 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
10110 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10120 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
10130 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
10140 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
10150 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
10160 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
10170 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
10180 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
10190 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
101a0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
101b0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
101c0 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
101d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
101e0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
101f0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
10200 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
10210 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
10220 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
10230 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
10240 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10250 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
10260 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
10270 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
10280 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
10290 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
102a0 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
102b0 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
102c0 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
102d0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
102e0 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
102f0 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
10300 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
10310 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  TE;.    if( unix
10320 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
10330 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20  &lock, 0) ){.   
10340 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
10350 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
10360 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10370 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10380 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
10390 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
103a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
103b0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
103c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
103d0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
103e0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
103f0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
10400 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
10410 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
10420 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
10430 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
10440 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
10450 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
10460 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
10470 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
10480 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
10490 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
104a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
104b0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
104c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
104d0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
104e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
104f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10500 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
10510 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
10520 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
10530 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10540 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
10550 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
10560 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
10570 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10580 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20  lock, 0) ){.    
10590 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
105a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
105b0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
105c0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
105d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
105e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
105f0 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
10600 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
10610 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
10620 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
10630 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
10640 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
10650 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
10660 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  LCK;.    if( uni
10670 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10680 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26 26 20 72   &lock, 10) && r
10690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
106a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
106b0 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
106c0 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
106d0 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  */.      tErrno 
106e0 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
106f0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
10700 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72 63  Y_IOERR.      rc
10710 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10720 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10730 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10740 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23 65 6c 73  R_UNLOCK); .#els
10750 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
10760 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10770 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ; .#endif.    }.
10780 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10790 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
107a0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
107b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
107c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
107d0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
107e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
107f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10800 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10810 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10820 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
10830 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
10840 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
10850 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
10860 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
10870 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
10880 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
10890 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
108a0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
108b0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
108c0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
108d0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
108e0 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
108f0 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
10900 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
10910 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
10920 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
10930 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
10940 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
10950 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
10960 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
10970 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
10980 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
10990 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
109a0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
109b0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
109c0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
109d0 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
109e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
109f0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
10a00 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
10a10 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
10a20 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
10a30 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
10a40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
10a50 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
10a60 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10a70 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
10a80 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
10a90 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
10aa0 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
10ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ac0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10ad0 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
10ae0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
10af0 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
10b00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
10b10 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10b20 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
10b30 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10b40 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
10b50 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10b60 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10b70 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
10b80 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
10b90 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
10ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
10bb0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
10bc0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
10bd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
10be0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10bf0 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
10c00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
10c10 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
10c20 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
10c30 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
10c40 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
10c50 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
10c60 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
10c70 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
10c80 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
10c90 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
10ca0 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
10cb0 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
10cc0 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
10cd0 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
10ce0 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
10cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
10d00 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
10d10 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10d20 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
10d30 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
10d40 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
10d50 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
10d60 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
10d70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
10d80 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
10d90 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
10da0 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
10db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10dc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10dd0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
10de0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
10df0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10e00 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
10e10 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
10e20 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
10e30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10e40 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
10e50 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
10e60 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
10e70 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
10e80 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
10e90 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
10ea0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
10eb0 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
10ec0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
10ed0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
10ee0 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
10ef0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
10f00 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
10f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10f20 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
10f30 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
10f40 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
10f50 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
10f60 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
10f70 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
10f80 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
10f90 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
10fa0 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
10fb0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
10fc0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
10fd0 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
10fe0 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e   *p = pFile->pUn
10ff0 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  used;.  p->pNext
11000 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73   = pInode->pUnus
11010 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55  ed;.  pInode->pU
11020 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69  nused = p;.  pFi
11030 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46  le->h = -1;.  pF
11040 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ile->pUnused = 0
11050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11060 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11070 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
11080 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
11090 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
110a0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
110b0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
110c0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
110d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
110e0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
110f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11100 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11110 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11120 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11130 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11140 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11150 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
11160 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
11170 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
11180 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
11190 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
111a0 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
111b0 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
111c0 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
111d0 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
111e0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
111f0 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
11200 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
11210 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
11220 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
11230 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
11240 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
11250 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
11260 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
11270 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
11280 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
11290 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
112a0 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
112b0 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
112c0 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
112d0 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63  c int posixUnloc
112e0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
112f0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11300 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  k, int handleNFS
11310 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
11320 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11330 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
11340 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
11350 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
11360 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
11370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11380 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11390 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
113a0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
113b0 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
113c0 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
113d0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
113e0 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
113f0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
11400 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
11410 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
11420 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
11430 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
11440 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11450 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11460 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
11470 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
11480 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
11490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
114a0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
114b0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
114c0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
114d0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
114e0 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
114f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11500 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11510 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
11520 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
11530 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
11540 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65  leLock );..#ifde
11550 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11560 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
11570 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
11580 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
11590 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
115a0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
115b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
115c0 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
115d0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
115e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
115f0 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
11600 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
11610 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11620 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
11630 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
11640 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
11650 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
11660 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
11670 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
11680 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
11690 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
116a0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
116b0 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
116c0 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
116d0 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
116e0 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
116f0 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
11700 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
11710 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
11720 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
11730 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  */.    pFile->in
11740 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
11750 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
11760 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
11770 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
11780 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
11790 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
117a0 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
117b0 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
117c0 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
117d0 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
117e0 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
117f0 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
11800 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
11810 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
11820 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
11830 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
11840 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
11850 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
11860 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
11870 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
11880 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
11890 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
118a0 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
118b0 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
118c0 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
118d0 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
118e0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
118f0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
11900 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
11910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11920 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
11930 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
11940 73 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  s */..#if !defin
11950 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
11960 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
11970 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
11980 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
11990 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
119a0 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
119b0 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
119c0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
119d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
119e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
119f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
11a00 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
11a10 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
11a20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d   off_t divSize =
11a30 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31   SHARED_SIZE - 1
11a40 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
11a50 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
11a60 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
11a70 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
11a80 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
11a90 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
11aa0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
11ab0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11ac0 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
11ad0 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
11ae0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
11af0 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20  lock, 10)==(-1) 
11b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
11b10 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
11b20 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
11b30 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
11b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11b50 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
11b60 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
11b70 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11b80 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
11b90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
11ba0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
11bb0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
11bc0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11bd0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
11be0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
11bf0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
11c00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11c10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
11c20 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
11c30 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
11c40 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
11c50 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11c60 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
11c70 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
11c80 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
11c90 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
11ca0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
11cb0 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
11cc0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
11cd0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
11ce0 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
11cf0 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
11d00 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
11d10 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
11d20 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63  ERR.          rc
11d30 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11d40 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11d50 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11d60 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_RDLOCK);.#else
11d70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
11d80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
11d90 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  OCK;.#endif.    
11da0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11db0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11dc0 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
11dd0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
11de0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
11df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11e00 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
11e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
11e30 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
11e40 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
11e50 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
11e60 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
11e70 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
11e80 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11e90 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
11ea0 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
11eb0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
11ec0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11ed0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28  e, &lock, 10)==(
11ee0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
11ef0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11f00 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
11f10 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
11f20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
11f30 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11f40 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11f50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11f60 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
11f70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11f80 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
11f90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
11fa0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11fb0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11fc0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11fd0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11fe0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
11ff0 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
12000 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
12010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12020 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
12030 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
12040 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
12050 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
12060 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
12070 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
12080 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
12090 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
120a0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
120b0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
120c0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
120d0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
120e0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
120f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
12100 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
12110 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b 0a  , &lock, 10) ){.
12120 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
12130 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
12140 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
12150 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
12160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12170 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12180 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12190 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
121a0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
121b0 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
121c0 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
121d0 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
121e0 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
121f0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
12200 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
12210 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
12220 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
12230 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
12240 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
12250 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
12260 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
12270 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
12280 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
12290 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
122a0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
122b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
122c0 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
122d0 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
122e0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
122f0 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
12300 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
12310 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
12320 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
12330 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
12340 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
12350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12360 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
12370 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12380 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
12390 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rrno);.#endif.  
123a0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
123b0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
123c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
123d0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
123e0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
123f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12400 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
12410 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
12430 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
12440 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
12450 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
12460 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
12470 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
12480 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
12490 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
124a0 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
124b0 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
124c0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
124d0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
124e0 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b  &lock, 10)==0 ){
124f0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
12500 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
12510 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
12520 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  e{.#if OSLOCKING
12530 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
12540 52 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  R.      tErrno =
12550 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
12560 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12570 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12580 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12590 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
125a0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
125b0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
125c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
125d0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
125e0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
125f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12600 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
12610 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12620 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
12630 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12640 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
12650 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12660 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
12670 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
12680 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
12690 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
126a0 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
126b0 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
126c0 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
126d0 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
126e0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
126f0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
12700 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
12710 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
12720 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
12730 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
12740 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
12750 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
12760 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
12770 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
12780 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
12790 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
127a0 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
127b0 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0L;.      if( un
127c0 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
127d0 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20  , &lock, 10)==0 
127e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
127f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12800 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
12810 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  lse{.#if OSLOCKI
12820 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
12830 45 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72  ERR.        tErr
12840 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12860 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12870 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12880 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
12890 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
128a0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
128b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  {.          stor
128c0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
128d0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
128e0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
128f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
12900 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
12910 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12920 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
12930 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12940 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
12950 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
12960 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
12970 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12980 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
12990 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
129a0 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
129b0 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
129c0 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
129d0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
129e0 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
129f0 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
12a00 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
12a10 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
12a20 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
12a30 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
12a40 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
12a50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
12a60 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
12a70 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
12a80 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
12a90 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
12aa0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
12ab0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
12ac0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
12ad0 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
12ae0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
12af0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12b00 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
12b10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12b20 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
12b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
12b40 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
12b50 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
12b60 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
12b70 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
12b80 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
12b90 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
12ba0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
12bb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
12bc0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
12bd0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
12be0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
12bf0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
12c00 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
12c10 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
12c20 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12c30 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
12c40 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
12c50 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12c60 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
12c70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
12c80 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
12c90 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
12ca0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
12cb0 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
12cc0 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
12cd0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
12ce0 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
12cf0 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
12d00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12d10 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
12d20 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
12d30 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
12d40 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
12d50 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
12d60 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
12d70 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
12d80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12d90 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
12da0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
12db0 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
12dc0 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
12dd0 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
12de0 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
12df0 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
12e00 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
12e10 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
12e20 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
12e30 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
12e40 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
12e50 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
12e60 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
12e70 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
12e80 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
12e90 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
12ea0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
12eb0 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
12ec0 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
12ed0 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
12ee0 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
12ef0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
12f00 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
12f10 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
12f20 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
12f30 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
12f40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12f50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
12f60 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12f70 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
12f80 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
12f90 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
12fa0 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
12fb0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
12fc0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
12fd0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
12fe0 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
12ff0 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
13000 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
13010 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
13020 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
13030 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
13040 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
13050 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
13060 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
13070 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
13080 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
13090 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
130a0 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
130b0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
130c0 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
130d0 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
130e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
130f0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
13100 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
13110 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
13120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13130 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
13140 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
13150 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
13160 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
13170 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
13180 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
13190 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
131a0 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
131b0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
131c0 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
131d0 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
131e0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
131f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13200 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13210 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
13220 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
13230 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13240 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
13250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13260 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13270 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
13280 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
13290 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
132a0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
132b0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
132c0 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78  ex();..  /* unix
132d0 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61  File.pInode is a
132e0 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65  lways valid here
132f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64  . Otherwise, a d
13300 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20  ifferent close. 
13310 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67   ** routine (e.g
13320 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29  . nolockClose())
13330 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64   would be called
13340 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
13350 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
13360 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20  pInode->nLock>0 
13370 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  || pFile->pInode
13380 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
13390 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  0 );.  if( ALWAY
133a0 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29  S(pFile->pInode)
133b0 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
133c0 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
133d0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
133e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
133f0 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
13400 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
13410 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
13420 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
13430 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
13440 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
13450 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
13460 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
13470 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
13480 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
13490 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
134a0 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
134b0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
134c0 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
134d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
134e0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
134f0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
13500 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
13510 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
13520 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
13530 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
13540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
13560 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
13570 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
13580 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
135f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
13660 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
13670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13690 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
136a0 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
136b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
136c0 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
136d0 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
136e0 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
136f0 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
13700 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
13710 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
13720 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
13730 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
13740 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
13750 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
13760 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
13770 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
13780 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
13790 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
137a0 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
137b0 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
137c0 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
137d0 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
137e0 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
137f0 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
13800 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
13810 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
13820 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
13830 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
13840 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
13850 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
13860 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13870 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
13880 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
13890 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
138a0 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
138b0 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
138c0 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
138d0 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
138e0 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
138f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
13900 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
13910 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
13920 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
13930 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
13940 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
13950 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
13960 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
13970 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
13980 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13990 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
139a0 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
139b0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
139c0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
139d0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
139e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
139f0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
13a00 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
13a10 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
13a20 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
13a30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
13a40 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
13a50 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
13a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13a70 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
13a80 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
13a90 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
13aa0 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
13ab0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13ac0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
13ad0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
13ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13af0 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
13b00 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13b10 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
13b20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
13b30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13b40 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
13b50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13b60 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
13b70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
13b80 20 20 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65    .  /* unixFile
13b90 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
13ba0 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
13bb0 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
13bc0 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 20 2a 2a  rent close.   **
13bd0 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
13be0 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
13bf0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
13c00 73 74 65 61 64 2e 0a 20 20 20 2a 2f 0a 20 20 61  stead..   */.  a
13c10 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
13c20 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
13c30 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
13c40 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
13c50 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
13c60 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
13c70 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
13c80 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
13c90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13ca0 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
13cb0 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
13cc0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
13cd0 6a 75 73 74 0a 20 20 20 20 20 2a 2a 20 79 65 74  just.     ** yet
13ce0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
13cf0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
13d00 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
13d10 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
13d20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
13d30 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
13d40 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
13d50 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
13d60 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
13d70 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
13d80 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
13d90 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73  d..     */.    s
13da0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
13db0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
13dc0 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
13dd0 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
13de0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
13df0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13e10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13e20 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
13e30 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
13e40 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13eb0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13f20 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
13f30 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f50 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
13f60 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
13f70 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
13f80 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
13f90 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
13fa0 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
13fb0 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
13fc0 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
13fd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
13fe0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
13ff0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
14000 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
14010 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
14020 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
14030 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
14040 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
14050 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
14060 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
14070 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
14080 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
14090 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
140a0 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
140b0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
140c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
140d0 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
140e0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
140f0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
14100 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
14110 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
14120 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
14130 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
14140 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
14150 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
14160 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
14170 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
14180 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
14190 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
141a0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
141b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
141c0 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
141d0 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
141e0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
141f0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
14200 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
14210 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
14220 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
14230 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
14240 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
14250 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
14260 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
14270 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
14280 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
14290 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
142a0 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
142b0 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
142c0 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
142d0 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
142e0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
142f0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
14300 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
14310 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
14320 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
14330 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
14340 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
14350 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
14360 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
14370 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14380 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
14390 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
143a0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
143b0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
143c0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
143d0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
143e0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
143f0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
14400 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
14410 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14420 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14430 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
14440 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
14450 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
14460 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
14470 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
14480 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
14490 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
144a0 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
144b0 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
144c0 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
144d0 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
144e0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
144f0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
14500 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
14510 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
14520 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
14530 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
14540 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
14550 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
14560 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
14570 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
14580 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
14590 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
145a0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
145b0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
145c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
145d0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
145e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
145f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14600 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14610 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14620 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14630 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14640 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14650 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
14660 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14670 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14680 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14690 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
146a0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
146b0 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
146c0 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
146d0 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
146e0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
146f0 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
14700 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
14710 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
14720 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
14730 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
14740 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
14750 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
14760 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
14770 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
14780 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
14790 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
147a0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
147b0 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
147c0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
147d0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
147e0 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73  served = osAcces
147f0 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d  s(zLockFile, 0)=
14800 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  =0;.  }.  OSTRAC
14810 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14820 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f   %d %d %d (dotlo
14830 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
14840 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
14850 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ;.  *pResOut = r
14860 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14870 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14880 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
14890 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
148a0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
148b0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
148c0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
148d0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
148e0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
148f0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14900 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14910 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14920 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14930 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14940 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14950 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14960 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14970 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
14980 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
14990 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
149a0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
149b0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
149c0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
149d0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
149e0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
149f0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14a00 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14a10 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14a20 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14a30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14a40 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14a50 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14a60 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14a70 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14a80 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
14a90 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
14aa0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
14ab0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
14ac0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14ad0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14ae0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14af0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14b00 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14b10 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14b20 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14b30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14b40 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14b50 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14b60 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
14b70 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
14b80 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
14b90 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
14ba0 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
14bb0 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
14bc0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
14bd0 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
14be0 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
14bf0 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
14c00 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
14c10 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
14c20 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
14c30 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14c40 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
14c50 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
14c60 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14c70 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
14c80 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
14c90 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
14ca0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
14cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14cc0 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
14cd0 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
14ce0 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
14cf0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
14d00 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
14d10 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
14d20 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
14d30 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
14d40 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
14d50 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14d60 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  Lock > NO_LOCK )
14d70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
14d80 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
14d90 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  ck;.    /* Alway
14da0 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
14db0 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
14dc0 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66  d file */.#ifdef
14dd0 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20   HAVE_UTIME.    
14de0 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c  utime(zLockFile,
14df0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20   NULL);.#else.  
14e00 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69    utimes(zLockFi
14e10 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  le, NULL);.#endi
14e20 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
14e30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
14e40 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
14e50 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
14e60 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f  rc = osMkdir(zLo
14e70 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20  ckFile, 0777);. 
14e80 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
14e90 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
14ea0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f  en/create the lo
14eb0 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  ck directory */.
14ec0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14ed0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
14ee0 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f  EEXIST == tErrno
14ef0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14f00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14f10 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
14f20 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14f30 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14f40 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14f50 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
14f60 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14f70 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
14f80 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
14f90 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
14fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14fb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14fc0 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74   .  .  /* got it
14fd0 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
14fe0 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
14ff0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15000 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
15010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15020 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
15030 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
15040 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15050 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
15060 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
15070 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
15080 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
15090 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
150a0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
150b0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
150c0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
150d0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
150e0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
150f0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
15100 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
15110 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
15120 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69  * When the locki
15130 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73  ng level reaches
15140 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65   NO_LOCK, delete
15150 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a   the lock file..
15160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
15170 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  tlockUnlock(sqli
15180 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15190 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
151a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
151b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
151c0 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
151d0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
151e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
151f0 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ext;.  int rc;..
15200 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15210 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15220 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
15230 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
15240 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
15250 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
15260 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15270 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
15280 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
15290 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
152a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
152b0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
152c0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
152d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
152e0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
152f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15300 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
15310 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
15320 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
15330 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
15340 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
15350 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
15360 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
15370 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
15380 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
15390 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
153a0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
153b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
153c0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
153d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
153e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
153f0 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
15400 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
15410 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
15420 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
15430 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
15440 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f  LOCK );.  rc = o
15450 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sRmdir(zLockFile
15460 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  );.  if( rc<0 &&
15470 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20   errno==ENOTDIR 
15480 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28  ) rc = osUnlink(
15490 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
154a0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( rc<0 ){.    in
154b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
154c0 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  ;.    rc = 0;.  
154d0 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
154e0 74 45 72 72 6e 6f 20 29 7b 0a 23 69 66 20 4f 53  tErrno ){.#if OS
154f0 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
15500 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72  SY_IOERR.      r
15510 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15520 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15530 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
15540 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73  RR_UNLOCK);.#els
15550 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
15560 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
15570 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
15580 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
15590 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
155a0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
155b0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
155c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
155d0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
155e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
155f0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
15600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15610 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
15620 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
15630 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
15640 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
15650 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
15660 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
15670 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
15680 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
15690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
156a0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
156b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
156c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
156d0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
156e0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
156f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15700 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
15710 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
15720 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
15730 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
15740 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15760 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
15770 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
15780 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
15790 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
157a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
157f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15830 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15850 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
15860 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15880 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
15890 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
158a0 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
158b0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
158c0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
158d0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
158e0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
158f0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
15900 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
15910 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
15920 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
15930 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
15940 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
15950 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
15960 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15970 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
15980 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
15990 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
159a0 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
159b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
159c0 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
159d0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
159e0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
159f0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
15a00 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
15a10 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
15a20 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
15a30 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
15a40 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
15a50 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
15a60 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
15a70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15a80 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
15a90 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
15aa0 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
15ab0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
15ac0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
15ad0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
15ae0 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  RKS../*.** Retry
15af0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
15b00 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
15b10 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
15b20 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
15b30 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
15b40 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
15b50 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
15b60 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
15b70 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
15b80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
15b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
15ba0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
15bb0 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
15bc0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
15bd0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
15be0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
15bf0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
15c00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
15c10 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
15c20 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
15c30 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
15c40 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
15c50 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
15c60 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
15c70 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
15c80 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
15c90 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
15ca0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
15cb0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
15cc0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
15cd0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
15ce0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
15cf0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
15d00 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15d10 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
15d20 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
15d30 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
15d40 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
15d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15d60 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
15d70 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
15d80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15d90 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
15da0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15db0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15dc0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15dd0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15de0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
15df0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15e00 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15e10 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
15e20 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
15e30 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15e40 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
15e50 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
15e60 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
15e70 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
15e80 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
15e90 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
15ea0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
15eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
15ec0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
15ed0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
15ee0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
15ef0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
15f00 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
15f10 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
15f20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
15f30 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
15f40 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
15f50 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
15f60 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
15f70 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
15f80 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
15f90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15fa0 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
15fb0 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
15fc0 65 72 72 6f 72 20 2a 2f 0a 23 69 66 20 4f 53 4c  error */.#if OSL
15fd0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
15fe0 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
15ff0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
16000 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
16010 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
16020 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
16030 6c 73 65 20 0a 20 20 20 20 20 20 20 20 6c 72 63  lse .        lrc
16040 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
16050 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
16060 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
16070 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
16080 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  {.          stor
16090 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
160a0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
160b0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
160c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
160d0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
160e0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
160f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
16100 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
16110 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
16120 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
16130 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
16140 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
16150 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
16160 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
16170 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
16180 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
16190 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
161a0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
161b0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
161c0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
161d0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
161e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
161f0 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
16200 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f  CK %d %d %d (flo
16210 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
16220 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
16230 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
16240 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16250 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
16260 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
16270 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
16280 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
16290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
162a0 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
162b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
162c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
162d0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
162e0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
162f0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
16300 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
16310 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
16320 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
16330 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
16340 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
16350 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
16360 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16370 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16380 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16390 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
163a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
163b0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
163c0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
163d0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
163e0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
163f0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16400 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
16410 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
16420 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
16430 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
16440 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
16450 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
16460 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16470 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16480 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16490 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
164a0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
164b0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
164c0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
164d0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
164e0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
164f0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16500 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
16510 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
16520 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
16530 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
16540 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
16550 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
16560 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16570 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16580 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16590 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
165a0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
165b0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
165c0 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
165d0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
165e0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
165f0 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
16600 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
16610 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
16620 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
16630 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
16640 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
16650 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
16660 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
16670 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
16680 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
16690 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
166a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
166b0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
166c0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
166d0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
166e0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
166f0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
16700 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
16710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
16720 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
16730 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
16740 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
16750 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16760 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
16770 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16780 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
16790 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
167a0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
167b0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
167c0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
167d0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
167e0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
167f0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
16800 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
16810 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
16820 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
16830 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
16840 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
16850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16860 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
16870 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
16880 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
16890 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
168a0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
168b0 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
168c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
168d0 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
168e0 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
168f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
16900 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16910 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
16920 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
16930 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16940 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
16950 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
16960 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
16970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  );.    }.  } els
16980 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
16990 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
169a0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
169b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
169c0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
169d0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
169e0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
169f0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
16a00 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
16a10 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
16a20 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
16a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
16a40 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
16a50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16a60 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16a70 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
16a80 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
16a90 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
16aa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16ab0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
16ac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
16ad0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
16ae0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
16af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16b00 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
16b10 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
16b20 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
16b30 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
16b40 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
16b50 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
16b60 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
16b70 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
16b80 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16b90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
16ba0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
16bb0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
16bc0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
16bd0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
16be0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16bf0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
16c00 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
16c10 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16c20 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16c30 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
16c40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
16c50 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
16c60 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16c70 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
16c80 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
16c90 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
16ca0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
16cb0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
16cc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16cd0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
16ce0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16cf0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
16d00 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
16d10 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
16d20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16d30 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
16d40 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
16d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16d60 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
16d70 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
16d80 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
16d90 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
16da0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
16db0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16dc0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16dd0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16de0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16e00 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
16e10 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
16e20 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
16e30 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
16e40 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
16e50 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16e60 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16e70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16e80 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
16e90 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16ea0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16eb0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
16ec0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
16ed0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
16ee0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16ef0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
16f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f10 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
16f20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
16f30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
16f40 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
16f50 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
16f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16f70 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
16f80 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
16f90 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
16fa0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
16fb0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
16fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
16fd0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
16fe0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
16ff0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
17000 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
17010 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
17020 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
17030 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
17040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17050 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170a0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
170b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
17110 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
17120 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
17130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17140 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
17150 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
17160 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
17170 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
17180 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
17190 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
171a0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
171b0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
171c0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
171d0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
171e0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
171f0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
17200 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
17210 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
17220 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
17230 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
17240 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
17250 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
17260 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
17270 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
17280 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
17290 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
172a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
172b0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
172c0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
172d0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
172e0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
172f0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
17300 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
17310 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
17320 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
17330 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
17340 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
17350 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
17360 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
17370 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
17380 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
17390 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
173a0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
173b0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
173c0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
173d0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
173e0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
173f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17400 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
17410 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17420 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
17430 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
17440 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17450 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
17460 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
17470 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17480 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
17490 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
174a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
174b0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
174c0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
174d0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
174e0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
174f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17500 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17510 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
17520 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
17530 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
17540 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
17550 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
17560 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
17570 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
17580 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
17590 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
175a0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
175b0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
175c0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
175d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
175e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
175f0 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
17600 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
17610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
17620 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
17630 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
17640 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
17650 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
17660 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
17670 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
17680 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
17690 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d  {.        /* som
176a0 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
176b0 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61  e lock when we a
176c0 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f  re in NO_LOCK */
176d0 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65  .        reserve
176e0 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  d = (pFile->eFil
176f0 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c  eLock < SHARED_L
17700 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
17710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
17720 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20  * we could have 
17730 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74  it if we want it
17740 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f   */.      sem_po
17750 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a  st(pSem);.    }.
17760 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
17770 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
17780 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  %d %d (sem)\n", 
17790 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
177a0 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
177b0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
177c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
177d0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
177e0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
177f0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
17800 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
17810 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
17820 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
17830 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
17840 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
17850 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
17860 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
17870 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
17880 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
17890 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
178a0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
178b0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
178c0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
178d0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
178e0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
178f0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
17900 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
17910 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
17920 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
17930 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
17940 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
17950 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
17960 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
17970 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
17980 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
17990 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
179a0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
179b0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
179c0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
179d0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
179e0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
179f0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
17a00 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
17a10 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
17a20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
17a30 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
17a40 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
17a50 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
17a60 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
17a70 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
17a80 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  SIVE.**.** Semap
17a90 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20  hore locks only 
17aa0 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
17ab0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
17ac0 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
17ad0 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
17ae0 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
17af0 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
17b00 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
17b10 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
17b20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
17b30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
17b40 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
17b50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
17b60 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
17b70 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
17b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
17b90 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
17ba0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
17bb0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
17bc0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
17bd0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
17be0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
17bf0 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71  c int semLock(sq
17c00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
17c10 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
17c20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17c30 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17c40 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
17c50 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
17c60 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
17c70 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
17c80 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
17c90 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
17ca0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
17cb0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
17cc0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
17cd0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
17ce0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
17cf0 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
17d00 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
17d10 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
17d20 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17d30 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
17d40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
17d50 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
17d60 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
17d70 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
17d80 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
17d90 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
17da0 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
17db0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
17dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17dd0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
17de0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
17df0 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
17e00 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
17e10 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
17e20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17e30 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17e40 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
17e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17e60 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
17e70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
17e80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17e90 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
17ea0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
17eb0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17ec0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17ed0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
17ee0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
17ef0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
17f00 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
17f10 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
17f20 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17f30 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17f40 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17f50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17f60 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
17f70 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17f80 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17f90 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
17fa0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17fb0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
17fc0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
17fd0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
17fe0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
17ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
18000 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
18010 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
18020 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
18030 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
18040 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
18050 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
18060 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
18070 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
18080 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
18090 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
180a0 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
180b0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
180c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
180d0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
180e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
180f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
18100 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
18110 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
18120 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
18130 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
18140 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
18150 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
18160 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18170 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
18180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18190 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
181a0 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
181b0 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
181c0 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
181d0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
181e0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
181f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
18200 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
18210 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
18220 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
18230 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
18240 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
18250 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
18260 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
18270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
18280 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
18290 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
182a0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
182b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
182c0 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
182d0 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
182e0 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71   int semClose(sq
182f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
18300 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
18310 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18320 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18330 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b  d;.    semUnlock
18340 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18350 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18360 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
18370 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
18380 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
18390 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
183a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
183b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
183c0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
183d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
183e0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
183f0 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
18400 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
18410 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
18420 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
18430 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
18440 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
18450 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
18460 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18470 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
18480 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184d0 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18520 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18540 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
18550 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
18560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18570 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
18580 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
18590 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
185a0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
185b0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
185c0 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
185d0 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
185e0 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
185f0 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
18600 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
18610 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
18620 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
18630 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
18640 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
18650 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
18660 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18670 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18680 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18690 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
186a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
186b0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
186c0 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
186d0 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
186e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
186f0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
18700 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
18710 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
18720 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
18730 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
18740 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
18750 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
18760 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18770 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
18780 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
18790 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
187a0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
187b0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
187c0 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
187d0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
187e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
187f0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
18800 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
18810 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
18820 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
18830 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
18840 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
18850 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
18860 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
18870 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18880 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
18890 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
188a0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
188b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
188c0 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
188d0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
188e0 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
188f0 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
18900 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
18930 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
18940 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
18950 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
18960 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
18970 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
18980 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
18990 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
189a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
189b0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
189c0 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
189d0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
189e0 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
189f0 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
18a00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18a10 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
18a20 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
18a30 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
18a40 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
18a50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
18a60 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
18a70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18a80 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
18a90 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
18aa0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18ab0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
18ac0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
18ad0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
18ae0 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
18af0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
18b00 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
18b10 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
18b20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
18b30 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
18b40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18b50 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
18b60 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
18b70 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
18b80 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
18b90 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
18ba0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
18bb0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
18bc0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
18bd0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
18be0 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
18bf0 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
18c00 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
18c10 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
18c20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
18c30 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
18c40 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
18c50 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
18c60 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
18c70 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
18c80 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
18c90 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
18ca0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
18cb0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
18cc0 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
18cd0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
18ce0 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
18cf0 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
18d00 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
18d10 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
18d20 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
18d30 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
18d40 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
18d50 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
18d60 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
18d70 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
18d80 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
18d90 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
18da0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18db0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
18dc0 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
18dd0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18de0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
18df0 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
18e00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
18e10 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
18e20 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
18e30 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
18e60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
18e70 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
18e80 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
18e90 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
18ea0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
18eb0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
18ec0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
18ed0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
18ee0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
18ef0 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
18f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
18f10 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
18f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18f40 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18f50 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
18f60 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
18f70 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
18f80 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
18f90 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
18fa0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
18fb0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
18fc0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
18fd0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
18fe0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
18ff0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
19000 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
19010 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
19020 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
19030 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
19040 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
19050 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
19060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
19070 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19080 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19090 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
190a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
190b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
190c0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
190d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
190e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
190f0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
19100 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
19110 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
19120 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
19130 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
19140 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
19150 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19160 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
19170 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
19180 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
19190 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
191a0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
191b0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
191c0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
191d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191e0 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
191f0 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
19200 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
19210 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
19220 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
19230 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
19240 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
19250 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
19260 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
19270 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
19280 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
19290 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
192a0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
192b0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
192c0 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
192d0 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
192e0 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
192f0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
19300 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
19310 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
19320 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
19330 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19340 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19350 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
19360 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
19370 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
19380 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
19390 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
193a0 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
193b0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
193c0 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
193d0 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
193e0 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
193f0 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
19400 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19410 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
19420 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
19430 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
19440 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
19450 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
19460 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
19470 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
19480 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
19490 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
194a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
194b0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
194c0 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
194d0 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
194e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
194f0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
19500 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
19510 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
19520 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
19530 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
19540 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
19550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19560 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
19570 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
19580 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
19590 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
195a0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
195b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
195c0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
195d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
195e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
195f0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
19600 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
19610 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
19620 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
19630 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
19640 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
19650 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
19660 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
19670 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
19680 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
19690 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
196a0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
196b0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
196c0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
196d0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
196e0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
196f0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
19700 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
19710 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
19720 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
19730 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
19740 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19750 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
19760 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
19770 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
19780 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
19790 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
197a0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
197b0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
197c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
197d0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
197e0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
197f0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
19800 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
19810 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19820 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
19830 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
19840 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
19850 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
19860 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
19870 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
19880 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
19890 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
198a0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
198b0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
198c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
198d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
198e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
198f0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
19900 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
19910 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
19920 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
19930 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
19940 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
19950 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
19960 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
19970 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
19980 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
19990 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
199a0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
199b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
199c0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
199d0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
199e0 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
199f0 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
19a00 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
19a10 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
19a20 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
19a30 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
19a40 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
19a50 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
19a60 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
19a70 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
19a80 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
19a90 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
19aa0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
19ab0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
19ac0 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
19ad0 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
19ae0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
19af0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
19b00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
19b10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
19b20 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
19b30 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
19b40 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
19b50 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
19b60 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
19b70 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
19b80 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
19b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19ba0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
19bb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
19bc0 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
19bd0 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
19be0 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
19bf0 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
19c00 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
19c10 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
19c20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
19c30 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
19c40 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
19c50 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
19c60 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
19c70 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
19c80 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
19c90 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
19ca0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
19cb0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
19cc0 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
19cd0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
19ce0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19cf0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
19d00 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
19d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
19d20 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
19d30 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
19d40 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
19d50 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
19d60 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
19d70 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
19d80 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
19d90 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
19da0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
19db0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
19dc0 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
19dd0 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
19de0 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
19df0 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
19e00 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
19e10 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
19e20 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
19e30 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
19e40 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
19e50 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
19e60 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
19e70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
19e80 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
19e90 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
19ea0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
19eb0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
19ec0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
19ed0 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
19ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
19ef0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
19f00 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
19f10 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
19f20 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
19f30 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
19f40 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
19f50 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
19f60 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
19f70 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
19f80 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
19f90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
19fa0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
19fb0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
19fc0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
19fd0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
19fe0 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
19ff0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1a000 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
1a010 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
1a020 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
1a030 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
1a040 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a050 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1a060 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a070 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
1a080 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
1a090 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
1a0a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
1a0b0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1a0c0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a0d0 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
1a0e0 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
1a0f0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1a100 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
1a110 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
1a120 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
1a130 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
1a140 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
1a150 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
1a160 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1a170 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
1a180 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
1a190 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
1a1a0 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
1a1b0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
1a1c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
1a1d0 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
1a1e0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1a1f0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
1a200 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
1a210 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
1a220 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
1a230 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
1a240 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1a250 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
1a260 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
1a270 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
1a280 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
1a290 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
1a2a0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1a2b0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
1a2c0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
1a2d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
1a2e0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
1a2f0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
1a300 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
1a310 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
1a320 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
1a330 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
1a340 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
1a350 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
1a360 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
1a370 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
1a380 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
1a390 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
1a3a0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
1a3b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a3c0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1a3d0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1a3e0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
1a3f0 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
1a400 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
1a410 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
1a420 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
1a430 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
1a440 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
1a450 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
1a460 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
1a470 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
1a480 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
1a490 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
1a4a0 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
1a4b0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
1a4c0 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
1a4d0 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
1a4e0 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
1a4f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a500 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
1a510 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
1a520 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
1a530 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
1a540 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
1a550 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
1a560 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
1a570 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1a580 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
1a590 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
1a5a0 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
1a5b0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
1a5c0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a5d0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a5e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
1a5f0 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
1a600 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
1a610 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
1a620 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1a630 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f  pFile, lrc1Errno
1a640 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  );.      rc = lr
1a650 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
1a660 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1a670 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
1a680 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
1a690 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
1a6a0 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
1a6b0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1a6c0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
1a6d0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
1a6e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
1a6f0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
1a700 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1a710 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
1a720 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
1a730 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
1a740 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
1a750 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
1a760 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
1a770 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
1a780 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
1a790 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
1a7a0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
1a7b0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
1a7c0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
1a7d0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
1a7e0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
1a7f0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
1a800 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
1a810 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
1a820 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1a830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1a840 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
1a850 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
1a860 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1a870 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
1a880 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1a890 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
1a8a0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
1a8b0 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
1a8c0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
1a8d0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
1a8e0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
1a8f0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
1a900 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
1a910 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
1a920 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
1a930 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1a940 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
1a950 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
1a960 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
1a970 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
1a980 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
1a990 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a9a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
1a9b0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
1a9c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
1a9d0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
1a9e0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
1a9f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1aa00 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
1aa10 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
1aa20 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
1aa30 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
1aa40 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
1aa50 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
1aa60 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
1aa70 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
1aa80 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
1aa90 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
1aaa0 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
1aab0 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
1aac0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
1aad0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
1aae0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
1aaf0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
1ab00 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
1ab10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1ab20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1ab30 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
1ab40 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
1ab50 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
1ab60 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
1ab70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
1ab80 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
1ab90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1aba0 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
1abb0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
1abc0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
1abd0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
1abe0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
1abf0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1ac00 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
1ac10 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
1ac40 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
1ac50 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
1ac60 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
1ac70 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1ac80 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aca0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
1acb0 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
1acc0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
1acd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
1ace0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
1acf0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
1ad00 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
1ad10 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
1ad20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
1ad30 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
1ad40 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1ad50 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
1ad60 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
1ad70 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
1ad80 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
1ad90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ada0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
1adb0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
1adc0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1add0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1ade0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1adf0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
1ae00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ae10 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
1ae20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1ae30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
1ae40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ae50 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
1ae60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
1ae70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
1ae80 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1ae90 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
1aea0 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
1aeb0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1aec0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
1aed0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
1aee0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
1aef0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
1af00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
1af10 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
1af20 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
1af30 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
1af40 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
1af50 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
1af60 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
1af70 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
1af80 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
1af90 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
1afa0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
1afb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1afc0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
1afd0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
1afe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
1aff0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
1b000 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
1b010 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
1b020 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
1b030 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
1b040 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1b050 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
1b060 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
1b070 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
1b080 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1b090 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1b0a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b0b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1b0c0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
1b0d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1b0e0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
1b0f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
1b100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
1b110 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1b120 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
1b130 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1b140 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
1b150 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
1b160 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
1b170 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
1b180 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1b190 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
1b1a0 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
1b1b0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
1b1c0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
1b1d0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1b1e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1b1f0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
1b200 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
1b210 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
1b220 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
1b230 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
1b240 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
1b250 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
1b260 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
1b270 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
1b280 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
1b290 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
1b2a0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
1b2b0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
1b2c0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1b2d0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
1b2e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
1b2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b300 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
1b310 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
1b320 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
1b330 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1b340 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
1b350 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
1b360 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
1b370 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
1b380 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
1b390 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
1b3a0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
1b3b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1b3c0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
1b3d0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
1b3e0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
1b3f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b400 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
1b410 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1b420 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
1b430 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
1b440 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
1b450 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
1b460 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
1b470 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
1b480 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1b490 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
1b4a0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1b4b0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
1b4c0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1b4d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1b4e0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
1b4f0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1b500 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
1b510 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
1b520 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1b530 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
1b540 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
1b550 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
1b560 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
1b570 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
1b580 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
1b590 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
1b5a0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
1b5b0 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
1b5c0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
1b5d0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1b5e0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
1b5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
1b600 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1b610 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1b620 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
1b630 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
1b640 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
1b650 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
1b660 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
1b670 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
1b680 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
1b690 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b6a0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1b6b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1b6c0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
1b6d0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
1b6e0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
1b6f0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
1b700 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1b710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
1b720 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
1b730 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
1b740 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
1b750 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
1b760 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
1b770 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
1b780 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
1b790 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
1b7a0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
1b7b0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
1b7c0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
1b7d0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
1b7e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1b7f0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
1b800 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
1b810 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1b820 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
1b830 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1b840 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1b850 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
1b860 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
1b870 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
1b880 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
1b890 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1b8a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
1b8b0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
1b8c0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
1b8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b8e0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
1b8f0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
1b900 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
1b910 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
1b920 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
1b930 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1b940 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
1b950 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
1b960 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
1b970 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
1b980 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
1b990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b9b0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
1b9c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
1b9d0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
1b9e0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
1b9f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
1ba00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
1ba10 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
1ba20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1ba30 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
1ba40 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
1ba50 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
1ba60 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
1ba70 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
1ba80 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
1ba90 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
1baa0 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
1bab0 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
1bac0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
1bad0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
1bae0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
1baf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
1bb00 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
1bb10 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
1bb20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
1bb30 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
1bb40 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
1bb50 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
1bb60 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
1bb70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1bb80 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
1bb90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1bba0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
1bbb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1bbc0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1bbd0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
1bbe0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
1bbf0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
1bc00 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
1bc10 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
1bc20 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
1bc30 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
1bc40 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
1bc50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
1bc60 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1bc70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1bc80 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
1bc90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1bca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bcb0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
1bcc0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
1bcd0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
1bce0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
1bcf0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
1bd00 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
1bd10 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
1bd20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
1bd30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1bd40 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1bd50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bd60 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
1bd70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
1bd80 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
1bd90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
1bda0 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
1bdb0 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
1bdc0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
1bdd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1bde0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
1bdf0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
1be00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1be10 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
1be20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1be30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1be40 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
1be50 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
1be60 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
1be70 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
1be80 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
1be90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
1bea0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
1beb0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
1bec0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
1bed0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
1bee0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
1bef0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
1bf00 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
1bf10 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
1bf20 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
1bf30 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
1bf40 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
1bf50 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
1bf60 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
1bf70 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1bf80 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
1bf90 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
1bfa0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
1bfb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
1bfc0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
1bfd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
1bfe0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
1bff0 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
1c000 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
1c010 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
1c020 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
1c030 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
1c040 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1c050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c060 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
1c070 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c080 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
1c090 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c0a0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
1c0b0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
1c0c0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
1c0d0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
1c0e0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
1c0f0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
1c100 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
1c110 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
1c120 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
1c130 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
1c140 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
1c150 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
1c160 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
1c170 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
1c180 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
1c190 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
1c1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1c1b0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
1c1c0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1c1d0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
1c1e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1c1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c230 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
1c240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c280 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2a0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
1c2b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
1c2e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c2f0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
1c300 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c310 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
1c320 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1c330 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
1c340 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
1c350 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
1c360 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
1c370 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
1c380 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
1c390 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
1c3a0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
1c3b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c3c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
1c3d0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
1c3e0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
1c3f0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
1c400 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c410 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
1c420 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
1c430 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1c440 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
1c450 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
1c460 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
1c470 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
1c480 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
1c490 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1c4a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1c4b0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
1c4c0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
1c4d0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
1c4e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1c4f0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
1c500 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
1c510 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
1c520 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
1c530 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
1c540 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
1c550 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
1c560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c570 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1c580 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
1c590 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1c5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c600 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1c610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c650 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c660 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
1c670 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
1c680 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
1c6b0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
1c6c0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
1c6d0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
1c6e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
1c6f0 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
1c700 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1c710 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
1c720 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
1c730 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
1c740 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
1c750 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
1c760 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
1c770 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
1c780 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
1c790 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
1c7a0 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
1c7b0 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
1c7c0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
1c7d0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
1c7e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
1c7f0 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
1c800 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1c810 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
1c820 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
1c830 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
1c840 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1c850 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
1c860 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
1c870 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
1c880 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
1c890 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
1c8a0 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
1c8b0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
1c8c0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
1c8d0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
1c8e0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
1c8f0 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
1c900 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
1c910 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
1c920 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
1c930 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
1c940 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
1c950 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
1c960 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
1c970 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
1c980 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
1c990 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
1c9a0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1c9b0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1c9c0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1c9d0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
1c9e0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1c9f0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1ca00 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1ca10 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
1ca20 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
1ca30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1ca40 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
1ca50 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
1ca60 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
1ca70 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
1ca80 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
1ca90 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
1caa0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
1cab0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
1cac0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1cad0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
1cae0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
1caf0 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
1cb00 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
1cb10 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
1cb20 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1cb30 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
1cb40 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
1cb50 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1cb60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1cb70 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
1cb80 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1cb90 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
1cba0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
1cbb0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1cbc0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
1cbd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1cbe0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
1cbf0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
1cc00 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
1cc10 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
1cc20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1cc30 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
1cc40 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
1cc50 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
1cc60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
1cc70 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
1cc80 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1cc90 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1cca0 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1ccb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ccc0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1ccd0 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1cce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1ccf0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1cd00 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1cd10 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1cd20 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1cd30 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1cd40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1cd50 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1cd60 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1cd70 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1cd80 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1cd90 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1cda0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1cdb0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
1cdc0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65  rrno);.      bre
1cdd0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
1cde0 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( got>0 ){.     
1cdf0 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20   cnt -= got;.   
1ce00 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74     offset += got
1ce10 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d  ;.      prior +=
1ce20 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66   got;.      pBuf
1ce30 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b   = (void*)(got +
1ce40 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20   (char*)pBuf);. 
1ce50 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67     }.  }while( g
1ce60 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ot>0 );.  TIMER_
1ce70 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
1ce80 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
1ce90 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1cea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d  .            id-
1ceb0 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f  >h, got+prior, o
1cec0 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d  ffset-prior, TIM
1ced0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
1cee0 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72  return got+prior
1cef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1cf00 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
1cf10 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
1cf20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cf30 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
1cf40 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
1cf50 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
1cf60 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
1cf70 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1cf80 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
1cf90 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
1cfa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1cfb0 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
1cfc0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
1cfd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1cfe0 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
1cff0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1d000 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
1d010 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
1d020 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  d );.  assert( o
1d030 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
1d040 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1d050 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d060 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1d070 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1d080 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1d090 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1d0a0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1d0b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1d0c0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1d0d0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1d0e0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1d0f0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1d100 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1d110 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1d120 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1d130 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1d140 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1d150 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   );.#endif..#if 
1d160 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1d170 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
1d180 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
1d190 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
1d1a0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
1d1b0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
1d1c0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1d1d0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
1d1e0 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
1d1f0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1d200 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d210 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
1d220 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
1d230 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1d240 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1d250 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1d260 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1d270 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
1d280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d290 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1d2a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
1d2b0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d2c0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1d2d0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
1d2e0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1d2f0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1d300 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
1d310 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
1d320 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
1d330 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
1d340 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
1d350 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
1d360 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f    }.#endif..  go
1d370 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
1d380 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1d390 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
1d3a0 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
1d3b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d3c0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
1d3d0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
1d3e0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1d3f0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
1d400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d410 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
1d420 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  else{.    /* Unr
1d430 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1d440 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1d450 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1d460 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1d470 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1d480 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1d490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d4a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1d4b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
1d4c0 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
1d4d0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1d4e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d4f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1d500 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
1d510 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
1d520 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1d530 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
1d540 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
1d550 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
1d560 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
1d570 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
1d580 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
1d590 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
1d5a0 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
1d5b0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1d5c0 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
1d5d0 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
1d5e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d5f0 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
1d600 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1d630 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
1d640 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
1d670 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
1d680 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
1d690 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d6b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1d6c0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
1d6d0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1d6e0 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d700 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
1d710 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
1d720 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1d750 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
1d760 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1d770 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d790 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1d7a0 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
1d7b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
1d7c0 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
1d7d0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1d7e0 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26  fd>2 );.  nBuf &
1d7f0 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1d800 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1d810 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1d820 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50  ).  do{ rc = osP
1d830 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  write(fd, pBuf, 
1d840 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68  nBuf, iOff); }wh
1d850 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1d860 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
1d870 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1d880 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63  READ64).  do{ rc
1d890 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 66 64   = osPwrite64(fd
1d8a0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1d8b0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1d8c0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1d8d0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1d8e0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1d8f0 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1d900 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1d910 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1d920 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69  Seek-- );..    i
1d930 66 28 20 69 53 65 65 6b 21 3d 69 4f 66 66 20 29  f( iSeek!=iOff )
1d940 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 45 72  {.      if( piEr
1d950 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1d960 20 28 69 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72   (iSeek==-1 ? er
1d970 72 6e 6f 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rno : 0);.      
1d980 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1d990 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1d9a0 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1d9b0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1d9c0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1d9d0 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1d9e0 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1d9f0 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1da00 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1da10 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1da20 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1da30 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1da40 20 26 26 20 70 69 45 72 72 6e 6f 20 29 20 2a 70   && piErrno ) *p
1da50 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1da60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1da70 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1da80 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1da90 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1daa0 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1dab0 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1dac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1dad0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1dae0 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1daf0 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1db00 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1db10 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1db20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1db30 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1db40 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1db50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1db60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db70 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1db80 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1db90 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1dba0 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1dbb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1dbc0 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1dbd0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1dbe0 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1dbf0 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1dc00 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1dc10 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1dc20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1dc30 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1dc40 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1dc50 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1dc60 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1dc70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1dc80 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1dc90 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1dca0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1dcb0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1dcc0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1dcd0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1dce0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1dcf0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1dd00 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1dd10 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1dd20 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1dd30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1dd40 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1dd50 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1dd60 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1dd70 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1dd80 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1dd90 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1dda0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1ddb0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1ddc0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1ddd0 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
1dde0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1ddf0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1de00 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1de10 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1de20 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1de30 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1de40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1de50 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1de60 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1de70 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1de80 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1de90 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
1dea0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1deb0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1dec0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1ded0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
1dee0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1def0 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
1df00 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1df10 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
1df20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
1df30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1df40 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
1df50 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
1df60 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
1df70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1df80 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1df90 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1dfa0 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
1dfb0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
1dfc0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1dfd0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
1dfe0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
1dff0 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
1e000 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
1e010 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
1e020 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1e030 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1e040 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
1e050 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
1e060 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
1e070 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1e080 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1e090 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
1e0a0 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
1e0b0 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
1e0c0 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
1e0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1e0e0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1e0f0 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
1e100 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1e110 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
1e120 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1e130 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1e140 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1e150 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1e160 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1e170 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
1e180 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
1e190 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
1e1a0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1e1b0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
1e1c0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
1e1d0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
1e1e0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
1e1f0 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
1e200 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
1e210 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1e220 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1e230 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1e240 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1e250 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1e260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e270 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1e280 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
1e290 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1e2a0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
1e2b0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1e2c0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1e2d0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1e2e0 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
1e2f0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
1e300 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
1e310 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
1e320 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
1e330 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
1e340 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1e350 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
1e360 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
1e370 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
1e380 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
1e390 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
1e3a0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
1e3b0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
1e3c0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
1e3d0 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
1e3e0 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1e3f0 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
1e400 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
1e410 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1e420 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
1e430 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
1e440 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
1e450 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
1e460 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
1e470 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
1e480 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1e490 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1e4a0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1e4b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e4c0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1e4d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e4e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1e4f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1e500 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1e510 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1e520 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1e530 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1e540 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1e550 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1e560 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1e570 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1e580 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1e590 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1e5a0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1e5b0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1e5c0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1e5d0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1e5e0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1e5f0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1e600 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1e610 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1e620 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1e630 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1e640 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1e650 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1e660 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1e670 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1e680 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1e690 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1e6a0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1e6b0 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1e6c0 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1e6d0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1e6e0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1e6f0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
1e700 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1e710 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
1e720 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1e730 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1e740 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1e750 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1e760 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1e770 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1e780 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1e790 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1e7a0 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1e7b0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1e7c0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1e7d0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1e7e0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1e7f0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1e800 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1e810 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1e820 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1e830 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1e840 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   0.#endif..#ifde
1e850 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51  f SQLITE_USE_REQ
1e860 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  UEST_FULLFSYNC.#
1e870 69 6d 70 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68  import <notify.h
1e880 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65  >.#import <libke
1e890 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73  rn/OSAtomic.h>.s
1e8a0 74 61 74 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b  tatic OSSpinLock
1e8b0 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30   notify_lock = 0
1e8c0 3b 0a 23 64 65 66 69 6e 65 20 52 45 51 55 45 53  ;.#define REQUES
1e8d0 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1e8e0 49 43 41 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e  ICATION    "com.
1e8f0 61 70 70 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23  apple.reqsync".#
1e900 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1e910 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
1e920 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
1e930 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
1e940 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
1e950 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
1e960 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
1e970 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
1e980 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
1e990 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
1e9a0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
1e9b0 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
1e9c0 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
1e9d0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
1e9e0 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
1e9f0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
1ea00 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
1ea10 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
1ea20 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
1ea30 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
1ea40 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
1ea50 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1ea60 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
1ea70 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
1ea80 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1ea90 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
1eaa0 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
1eab0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
1eac0 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
1ead0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eae0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
1eaf0 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
1eb00 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
1eb10 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1eb20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
1eb30 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
1eb40 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
1eb50 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
1eb60 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
1eb70 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
1eb80 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
1eb90 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
1eba0 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
1ebb0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
1ebc0 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
1ebd0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1ebe0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
1ebf0 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
1ec00 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
1ec10 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
1ec20 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
1ec30 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
1ec40 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
1ec50 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
1ec60 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
1ec70 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1ec80 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
1ec90 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
1eca0 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
1ecb0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1ecc0 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
1ecd0 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
1ece0 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
1ecf0 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
1ed00 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
1ed10 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
1ed20 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
1ed30 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1ed40 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
1ed50 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
1ed60 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
1ed70 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
1ed80 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
1ed90 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
1eda0 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
1edb0 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
1edc0 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
1edd0 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
1ede0 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
1edf0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
1ee00 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
1ee10 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
1ee20 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
1ee30 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
1ee40 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
1ee50 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
1ee60 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
1ee70 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
1ee80 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
1ee90 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
1eea0 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
1eeb0 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
1eec0 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
1eed0 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
1eee0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
1eef0 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
1ef00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ef10 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
1ef20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1ef30 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
1ef40 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1ef50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ef60 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1ef70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ef80 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
1ef90 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1efa0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1efb0 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1efc0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
1efd0 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1efe0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1eff0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1f000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1f010 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1f020 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1f030 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1f040 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1f050 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1f060 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1f070 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1f080 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1f090 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1f0a0 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1f0b0 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1f0c0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1f0d0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1f0e0 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1f0f0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1f100 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1f110 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1f120 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1f130 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1f140 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1f150 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1f160 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1f170 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
1f180 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
1f190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
1f1a0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f1b0 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1f1c0 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nc ){.#ifdef SQL
1f1d0 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
1f1e0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63  FULLFSYNC.    rc
1f1f0 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a   = osFsync(fd);.
1f200 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
1f210 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c       OSSpinLockL
1f220 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
1f230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
1f240 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53  tify_post(REQUES
1f250 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1f260 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20  ICATION);.      
1f270 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b  OSSpinLockUnlock
1f280 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1f290 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1f2a0 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1f2b0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1f2c0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f2d0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1f2e0 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1f2f0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1f300 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1f310 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1f320 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1f330 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1f340 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1f350 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1f360 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1f370 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1f380 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1f390 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1f3a0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1f3b0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1f3c0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1f3d0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1f3e0 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1f3f0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1f400 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1f410 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1f420 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1f430 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1f440 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1f450 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1f460 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1f470 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1f480 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1f490 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1f4a0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1f4b0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1f4c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f4d0 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1f4e0 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1f4f0 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1f500 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1f510 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1f520 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1f530 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1f540 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1f550 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1f560 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1f570 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1f580 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1f590 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1f5a0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1f5b0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1f5c0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1f5d0 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1f5e0 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1f5f0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1f600 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1f610 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1f620 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1f630 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1f640 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1f650 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1f660 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1f670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f680 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1f690 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1f6a0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1f6b0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1f6c0 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1f6d0 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1f6e0 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1f6f0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1f700 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1f710 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1f720 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f730 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1f740 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1f750 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1f760 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f770 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1f780 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1f790 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1f7a0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1f7b0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1f7c0 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1f7d0 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1f7e0 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1f7f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1f800 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1f810 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1f820 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1f830 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1f840 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1f850 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1f860 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1f870 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1f880 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1f890 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1f8a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f8b0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1f8c0 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1f8d0 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1f8e0 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1f8f0 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1f900 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1f910 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1f920 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1f930 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1f940 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1f950 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1f960 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1f970 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1f980 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1f990 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1f9a0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1f9b0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1f9c0 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1f9d0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1f9e0 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1f9f0 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1fa00 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1fa10 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1fa20 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1fa30 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1fa40 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1fa50 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1fa60 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1fa70 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1fa80 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1fa90 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1faa0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1fab0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1fac0 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1fad0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1fae0 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1faf0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1fb00 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1fb10 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1fb20 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1fb30 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1fb40 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1fb50 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1fb60 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1fb70 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1fb80 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1fb90 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1fba0 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
1fbb0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1fbc0 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1fbd0 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1fbe0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
1fbf0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1fc00 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1fc10 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1fc20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1fc30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1fc40 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1fc50 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1fc60 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
1fc70 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1fc80 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1fc90 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72  TE_OK:unixLogErr
1fca0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1fcb0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
1fcc0 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a   zDirname));.}..
1fcd0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1fce0 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
1fcf0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
1fd00 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
1fd10 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
1fd20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
1fd30 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
1fd40 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
1fd50 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
1fd60 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
1fd70 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
1fd80 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
1fd90 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
1fda0 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
1fdb0 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1fdc0 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
1fdd0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1fde0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1fdf0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
1fe00 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
1fe10 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
1fe20 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
1fe30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1fe40 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
1fe50 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1fe60 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
1fe70 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1fe80 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
1fe90 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1fea0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
1feb0 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
1fec0 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
1fed0 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
1fee0 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
1fef0 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
1ff00 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1ff10 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
1ff20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1ff30 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1ff40 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
1ff50 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
1ff60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
1ff70 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
1ff80 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
1ff90 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
1ffa0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
1ffb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ffc0 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
1ffd0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
1ffe0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1fff0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
20000 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
20010 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
20020 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
20030 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
20040 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
20050 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
20060 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
20070 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
20080 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
20090 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
200a0 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
200b0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
200c0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
200d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
200e0 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
200f0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
20100 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
20110 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
20120 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
20130 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
20140 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
20150 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
20160 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
20170 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
20180 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
20190 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
201a0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
201b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
201c0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
201d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
201e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
201f0 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
20200 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d  ile->h));.  rc =
20210 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
20220 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
20230 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
20240 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
20250 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
20260 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  rc ){.    storeL
20270 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
20280 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
20290 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
202a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
202b0 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22  NC, "full_fsync"
202c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
202d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  .  }..  /* Also 
202e0 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74  fsync the direct
202f0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
20300 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44  he file if the D
20310 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a  IRSYNC flag.  **
20320 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69   is set.  This i
20330 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63  s a one-time occ
20340 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73  urrence.  Many s
20350 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73  ystems (examples
20360 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20  : AIX).  ** are 
20370 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20  unable to fsync 
20380 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20  a directory, so 
20390 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e  ignore errors on
203a0 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f   the fsync..  */
203b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
203c0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
203d0 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20  LE_DIRSYNC ){.  
203e0 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20    int dirfd;.   
203f0 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59   OSTRACE(("DIRSY
20400 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c  NC %s (have_full
20410 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e  fsync=%d fullsyn
20420 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  c=%d)\n", pFile-
20430 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20  >zPath,.        
20440 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59      HAVE_FULLFSY
20450 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29  NC, isFullsync))
20460 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
20470 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65  nDirectory(pFile
20480 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  ->zPath, &dirfd)
20490 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
204a0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64  LITE_OK && dirfd
204b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c  >=0 ){.      ful
204c0 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30  l_fsync(dirfd, 0
204d0 2c 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53  , 0);.#if OSCLOS
204e0 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f  E_CHECK_CLOSE_IO
204f0 45 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c  ERR.      if( cl
20500 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
20510 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
20520 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
20530 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
20540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
20550 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a  OERR_DIR_CLOSE;.
20560 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
20570 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
20580 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f  (pFile, dirfd, _
20590 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66  _LINE__);.#endif
205a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
205b0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
205c0 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
205d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
205e0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  }.    pFile->ctr
205f0 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
20600 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 0a 20 20  ILE_DIRSYNC;..  
20610 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20620 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
20630 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
20640 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
20650 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
20660 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
20670 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
20680 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
20690 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
206a0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
206b0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
206c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
206d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
206e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
206f0 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
20700 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
20710 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
20720 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
20730 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
20740 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
20750 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
20760 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
20770 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
20780 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
20790 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
207a0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
207b0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
207c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
207d0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
207e0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
207f0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
20800 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
20810 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
20820 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
20830 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
20840 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
20850 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
20860 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
20870 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29  File->h, (off_t)
20880 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
20890 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
208a0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
208b0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
208c0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
208d0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
208e0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
208f0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
20900 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
20910 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20920 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
20930 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
20940 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
20950 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
20960 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
20970 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
20980 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
20990 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
209a0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
209b0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
209c0 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
209d0 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
209e0 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
209f0 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
20a00 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
20a10 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
20a20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
20a30 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
20a40 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
20a50 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
20a60 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
20a70 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
20a80 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
20a90 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
20aa0 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
20ab0 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
20ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
20ad0 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
20ae0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
20af0 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
20b00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
20b10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
20b20 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e  le was just trun
20b30 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
20b40 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
20b50 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
20b60 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
20b70 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
20b80 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
20b90 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
20ba0 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75  te will.    ** u
20bb0 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
20bc0 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
20bd0 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
20be0 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
20bf0 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  on.  .    */.   
20c00 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65   if( nByte<pFile
20c10 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
20c20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
20c30 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
20c40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
20c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20c60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
20c70 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
20c80 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
20c90 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
20ca0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
20cb0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
20cc0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
20cd0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
20ce0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
20cf0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
20d00 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
20d10 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
20d20 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
20d30 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
20d40 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
20d50 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
20d60 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
20d70 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
20d80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20d90 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
20da0 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
20db0 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
20dc0 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
20dd0 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
20de0 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
20df0 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
20e00 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
20e10 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
20e20 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
20e30 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
20e40 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
20e50 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
20e60 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
20e70 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
20e80 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
20e90 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
20ea0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
20eb0 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
20ec0 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
20ed0 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
20ee0 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
20ef0 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
20f00 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
20f10 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
20f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20f30 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
20f40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
20f50 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
20f60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
20f70 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
20f80 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
20f90 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
20fa0 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
20fb0 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
20fc0 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
20fd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
20fe0 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
20ff0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
21000 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
21010 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
21020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21030 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
21040 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
21050 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
21060 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
21070 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74  tion.  Enlarge t
21080 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e  he database to n
21090 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a  Bytes in size.**
210a0 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20   (rounded up to 
210b0 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73  the next chunk-s
210c0 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61  ize).  If the da
210d0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
210e0 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c  y.** nBytes or l
210f0 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74  arger, this rout
21100 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
21110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
21120 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
21130 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
21140 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70   nByte){.  if( p
21150 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
21160 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
21170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21180 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
21190 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
211a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
211b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
211c0 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
211d0 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
211e0 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
211f0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
21200 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  pFile->h, &buf) 
21210 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21220 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20  IOERR_FSTAT;..  
21230 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
21240 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
21250 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
21260 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
21270 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
21280 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
21290 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
212a0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
212b0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
212c0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
212d0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
212e0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
212f0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
21300 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
21310 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
21320 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
21330 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
21340 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
21350 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
21360 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
21370 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
21380 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
21390 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
213a0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
213b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
213c0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
213d0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
213e0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
213f0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
21400 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
21410 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
21420 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
21430 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
21440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21450 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
21460 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
21470 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
21480 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
21490 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72  (), fake it. Fir
214a0 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  st use.      ** 
214b0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73  ftruncate() to s
214c0 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  et the file size
214d0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73  , then write a s
214e0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20  ingle byte to.  
214f0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
21500 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f  byte in each blo
21510 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ck within the ex
21520 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
21530 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
21540 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71  the same techniq
21550 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63  ue used by glibc
21560 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f   to implement po
21570 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a  six_fallocate().
21580 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74        ** on syst
21590 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ems that do not 
215a0 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
215b0 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63  ocate() system c
215c0 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
215d0 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
215e0 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
215f0 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
21600 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
21610 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21630 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
21640 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
21650 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
21660 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
21670 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20  h, nSize) ){.   
21680 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
21690 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
216a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
216b0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
216c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
216d0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
216e0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
216f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21700 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73  iWrite = ((buf.s
21710 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20  t_size + 2*nBlk 
21720 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d  - 1)/nBlk)*nBlk-
21730 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
21740 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a  iWrite<nSize ){.
21750 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
21760 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
21770 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
21780 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
21790 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
217a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
217b0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
217c0 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
217d0 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  lk;.      }.#end
217e0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  if.    }.  }..#i
217f0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21800 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
21810 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
21820 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69  x>0 && nByte>pFi
21830 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
21840 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21850 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
21860 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nk<=0 ){.      i
21870 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
21880 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
21890 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  yte) ){.        
218a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
218b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
218c0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
218d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
218e0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
218f0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
21900 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
21910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
21920 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
21930 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
21940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
21950 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
21960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
21970 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
21980 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
21990 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
219a0 45 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  E__).#include "s
219b0 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68  qlite3_private.h
219c0 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79  ".#include <copy
219d0 66 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69  file.h>.static i
219e0 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f 72 55  nt getDbPathForU
219f0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
21a00 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
21a10 62 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a  bPath);.#endif..
21a20 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
21a30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
21a40 73 74 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f  static int isPro
21a50 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e  xyLockingMode(un
21a60 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69  ixFile *);.#endi
21a70 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45  f..#if (SQLITE_E
21a80 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
21a90 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
21aa0 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20  APPLE__).static 
21ab0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
21ac0 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c  Database(unixFil
21ad0 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74  e *, int);..stat
21ae0 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c  ic int unixInval
21af0 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65  idateSupportFile
21b00 73 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e  s(unixFile *, in
21b10 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  t);..static int 
21b20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
21b30 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  de(const char *,
21b40 20 69 6e 74 2c 20 6d 6f 64 65 5f 74 2a 2c 20 75   int, mode_t*, u
21b50 69 64 5f 74 20 2a 2c 67 69 64 5f 74 20 2a 29 3b  id_t *,gid_t *);
21b60 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61 20 72 65 61  ../* opens a rea
21b70 64 2f 77 72 69 74 65 20 63 6f 6e 6e 65 63 74 69  d/write connecti
21b80 6f 6e 20 74 6f 20 61 20 66 69 6c 65 20 7a 4e 61  on to a file zNa
21b90 6d 65 20 69 6e 68 65 72 69 74 69 6e 67 20 74 68  me inheriting th
21ba0 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
21bb0 20 75 73 65 72 2f 70 65 72 6d 73 20 66 72 6f 6d   user/perms from
21bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21bd0 6c 65 20 69 66 20 72 75 6e 6e 69 6e 67 20 61 73  le if running as
21be0 20 72 6f 6f 74 2e 20 20 52 65 74 75 72 6e 73 20   root.  Returns 
21bf0 74 68 65 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73  the file .** des
21c00 63 72 69 70 74 6f 72 20 62 79 20 72 65 66 65 72  criptor by refer
21c10 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ence.*/.static i
21c20 6e 74 20 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64  nt unixOpenChild
21c30 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  File(.  const ch
21c40 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
21c50 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e   openFlags,.  in
21c60 74 20 64 62 4f 70 65 6e 46 6c 61 67 73 2c 0a 20  t dbOpenFlags,. 
21c70 20 69 6e 74 20 70 72 6f 74 46 6c 61 67 73 2c 0a   int protFlags,.
21c80 20 20 69 6e 74 20 2a 70 46 64 0a 29 7b 0a 20 20    int *pFd.){.  
21c90 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 6d  int fd = -1;.  m
21ca0 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20  ode_t openMode; 
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21cc0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63  Permissions to c
21cd0 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20  reate file with 
21ce0 2a 2f 0a 20 20 75 69 64 5f 74 20 75 69 64 3b 20  */.  uid_t uid; 
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72     /* Userid for
21d10 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
21d20 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d40 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
21d50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
21d60 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 46  ;.  .  assert(pF
21d70 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20 72 63 20 3d  d!=NULL);.  rc =
21d80 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
21d90 6f 64 65 28 7a 4e 61 6d 65 2c 20 64 62 4f 70 65  ode(zName, dbOpe
21da0 6e 46 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64  nFlags, &openMod
21db0 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
21dc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
21de0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 64 20 3d  n rc;.  }.  fd =
21df0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
21e00 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
21e10 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 4f 53 54 52  penMode);.  OSTR
21e20 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
21e30 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
21e40 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
21e50 67 73 29 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  gs));.  if( fd<0
21e60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
21e70 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
21e80 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
21e90 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
21ea0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21eb0 20 7d 0a 20 20 2f 2a 20 69 66 20 77 65 27 72 65   }.  /* if we're
21ec0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 77 61 6c   opening the wal
21ed0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   or journal and 
21ee0 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c  running as root,
21ef0 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f   set.  ** the jo
21f00 75 72 6e 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f  urnal uid/gid */
21f10 0a 20 20 69 66 28 20 64 62 4f 70 65 6e 46 6c 61  .  if( dbOpenFla
21f20 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
21f30 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
21f40 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
21f50 29 7b 0a 20 20 20 20 75 69 64 5f 74 20 65 75 69  ){.    uid_t eui
21f60 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b 0a 20  d = geteuid();. 
21f70 20 20 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26     if( euid==0 &
21f80 26 20 28 65 75 69 64 21 3d 75 69 64 20 7c 7c 20  & (euid!=uid || 
21f90 67 65 74 65 67 69 64 28 29 21 3d 67 69 64 29 20  getegid()!=gid) 
21fa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 63 68  ){.      if( fch
21fb0 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
21fc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
21fd0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
21fe0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  N_BKPT;.      }.
21ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22010 0a 20 20 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a  .    *pFd = fd;.
22020 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a    } else {.    *
22030 70 46 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6c  pFd = -1;.    cl
22040 6f 73 65 28 66 64 29 3b 0a 20 20 7d 0a 20 20 72  ose(fd);.  }.  r
22050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
22060 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 70 6c  tic int unixRepl
22070 61 63 65 44 61 74 61 62 61 73 65 28 75 6e 69 78  aceDatabase(unix
22080 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  File *pFile, sql
22090 69 74 65 33 20 2a 73 72 63 64 62 29 20 7b 0a 20  ite3 *srcdb) {. 
220a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
220b0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
220c0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 42 74 72  e *)pFile;.  Btr
220d0 65 65 20 2a 70 53 72 63 42 74 72 65 65 20 3d 20  ee *pSrcBtree = 
220e0 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  NULL;.  sqlite3_
220f0 66 69 6c 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d  file *src_file =
22100 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69 78 46 69 6c   NULL;.  unixFil
22110 65 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e 55  e *pSrcFile = NU
22120 4c 4c 3b 0a 20 20 63 68 61 72 20 73 72 63 57 61  LL;.  char srcWa
22130 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  lPath[MAXPATHLEN
22140 2b 35 5d 3b 0a 20 20 69 6e 74 20 73 72 63 57 61  +5];.  int srcWa
22150 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  lFD = -1;.  int 
22160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22170 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20    void *pLock = 
22180 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67  NULL;.  int flag
22190 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  s = 0;.  sqlite3
221a0 20 2a 73 72 63 64 62 32 20 3d 20 4e 55 4c 4c 3b   *srcdb2 = NULL;
221b0 0a 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74  .  copyfile_stat
221c0 65 5f 74 20 73 3b 0a 20 20 69 6e 74 20 63 6f 72  e_t s;.  int cor
221d0 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 20  ruptSrcFileLock 
221e0 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75  = 0;.  int corru
221f0 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 20 3d 20  ptDstFileLock = 
22200 30 3b 0a 20 20 69 6e 74 20 69 73 53 72 63 43 6f  0;.  int isSrcCo
22210 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrupt = 0;.  int
22220 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20   isDstCorrupt = 
22230 30 3b 0a 20 20 0a 20 20 69 66 28 20 21 73 71 6c  0;.  .  if( !sql
22240 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
22250 6b 28 73 72 63 64 62 29 20 29 7b 0a 20 20 20 20  k(srcdb) ){.    
22260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
22270 53 55 53 45 3b 0a 20 20 7d 0a 20 20 20 20 0a 23  SUSE;.  }.    .#
22280 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22290 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
222a0 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c  .  flags |= pFil
222b0 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65  e->protFlags;.#e
222c0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
222d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
222e0 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50 72 6f  TYLE.  if( isPro
222f0 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46  xyLockingMode(pF
22300 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c 61 67  ile) ){.    flag
22310 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
22320 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a  _AUTOPROXY;.  }.
22330 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
22340 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
22350 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50  erlock(pFile->zP
22360 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30  ath, 0, flags, 0
22370 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20  , 0, &pLock);.  
22380 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
22390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
223a0 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  RUPT || rc==SQLI
223b0 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20  TE_NOTADB ){.   
223c0 20 20 20 69 73 44 73 74 43 6f 72 72 75 70 74 20     isDstCorrupt 
223d0 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
223e0 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
223f0 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  rlock_corrupt(id
22400 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
22410 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20 20  CLUSIVE,.       
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 26 63 6f 72 72 75 70 74 44 73 74 46 69 6c    &corruptDstFil
22450 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  eLock);.    }.  
22460 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22480 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20   }.  }.  /* get 
22490 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65 73  the src file des
224a0 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e 67  criptor adhering
224b0 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75 63   to the db struc
224c0 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 0a  t access rules .
224d0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
224e0 69 73 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72  is modeled after
224f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22500 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e  ntrol() in main.
22510 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74  c.   */ .  sqlit
22520 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
22530 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
22540 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30  if( srcdb->nDb>0
22550 20 29 7b 0a 20 20 20 20 70 53 72 63 42 74 72 65   ){.    pSrcBtre
22560 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b 30  e = srcdb->aDb[0
22570 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ].pBt;.  }.  if(
22580 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20   pSrcBtree ){.  
22590 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61 67    Pager *pSrcPag
225a0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  er;.    sqlite3B
225b0 74 72 65 65 45 6e 74 65 72 28 70 53 72 63 42 74  treeEnter(pSrcBt
225c0 72 65 65 29 3b 0a 20 20 20 20 70 53 72 63 50 61  ree);.    pSrcPa
225d0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
225e0 65 65 50 61 67 65 72 28 70 53 72 63 42 74 72 65  eePager(pSrcBtre
225f0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
22600 70 53 72 63 50 61 67 65 72 21 3d 30 20 29 3b 0a  pSrcPager!=0 );.
22610 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73      src_file = s
22620 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
22630 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20 20  pSrcPager);.    
22640 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c 65  assert( src_file
22650 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
22660 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  rc_file->pMethod
22670 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  s ){.      int s
22680 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  rcFlags = 0;.   
22690 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28 75     pSrcFile = (u
226a0 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66 69  nixFile *)src_fi
226b0 6c 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  le;.#if SQLITE_E
226c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
226d0 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
226e0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20  _APPLE__).      
226f0 69 66 20 28 28 70 53 72 63 46 69 6c 65 2d 3e 6f  if ((pSrcFile->o
22700 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44 57  penFlags & O_RDW
22710 52 29 20 3d 3d 20 4f 5f 52 44 57 52 29 20 7b 0a  R) == O_RDWR) {.
22720 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
22730 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
22740 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
22750 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
22760 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49   srcFlags = SQLI
22770 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
22780 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
22790 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d        srcFlags =
227a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
227b0 44 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 23  DWRITE;.#endif.#
227c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
227d0 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
227e0 0a 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20  .      srcFlags 
227f0 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e 70 72 6f  |= pSrcFile->pro
22800 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
22810 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22820 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
22830 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79       if( isProxy
22840 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63  LockingMode(pSrc
22850 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 20  File) ){.       
22860 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c   srcFlags |= SQL
22870 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
22880 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  XY;.      }.#end
22890 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  if.      rc = sq
228a0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 53  lite3_open_v2(pS
228b0 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  rcFile->zPath, &
228c0 73 72 63 64 62 32 2c 20 73 72 63 46 6c 61 67 73  srcdb2, srcFlags
228d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
228e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
228f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72  .        /* star
22900 74 20 61 20 64 65 66 65 72 72 65 64 20 74 72 61  t a deferred tra
22910 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 61  nsaction and rea
22920 64 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61  d to establish a
22930 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
22940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22950 65 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20  e3_exec(srcdb2, 
22960 22 42 45 47 49 4e 20 44 45 46 45 52 52 45 44 3b  "BEGIN DEFERRED;
22970 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76   PRAGMA schema_v
22980 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  ersion",.       
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20     0, 0, 0);.   
229b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
229c0 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72  ITE_CORRUPT || r
229d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  c==SQLITE_NOTADB
229e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
229f0 53 72 63 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a  SrcCorrupt = 1;.
22a00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22a10 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
22a20 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63  lock_corrupt(src
22a30 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f  _file, SQLITE_LO
22a40 43 4b 5f 53 48 41 52 45 44 2c 0a 20 20 20 20 20  CK_SHARED,.     
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 20 20 20 20 26 63 6f 72 72 75 70 74          &corrupt
22a80 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  SrcFileLock);.  
22a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22aa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22ab0 21 73 72 63 64 62 32 20 7c 7c 20 70 53 72 63 46  !srcdb2 || pSrcF
22ac0 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72  ile==NULL || pSr
22ad0 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20  cFile->h<0){.   
22ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
22af0 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  ERNAL;.  }.  if(
22b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22b10 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72  {.    goto end_r
22b20 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3b  eplace_database;
22b30 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64  .  }.  /* both d
22b40 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
22b50 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
22b60 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63 20  y, copy the src 
22b70 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a  wal journal if .
22b80 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73     ** one exists
22b90 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 61 63   and then the ac
22ba0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  tual database fi
22bb0 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63  le.   */.  strlc
22bc0 70 79 28 73 72 63 57 61 6c 50 61 74 68 2c 20 70  py(srcWalPath, p
22bd0 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  SrcFile->zPath, 
22be0 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
22bf0 20 73 74 72 6c 63 61 74 28 73 72 63 57 61 6c 50   strlcat(srcWalP
22c00 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58  ath, "-wal", MAX
22c10 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72  PATHLEN+5);.  sr
22c20 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72  cWalFD = open(sr
22c30 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e  cWalPath, O_RDON
22c40 4c 59 29 3b 0a 20 20 69 66 28 20 21 28 73 72 63  LY);.  if( !(src
22c50 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20 20  WalFD<0) ){.    
22c60 63 68 61 72 20 64 73 74 57 61 6c 50 61 74 68 5b  char dstWalPath[
22c70 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
22c80 20 20 20 69 6e 74 20 64 73 74 57 61 6c 46 44 20     int dstWalFD 
22c90 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 70 72  = -1;.    int pr
22ca0 6f 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  otFlags = 0;.   
22cb0 20 73 74 72 6c 63 70 79 28 64 73 74 57 61 6c 50   strlcpy(dstWalP
22cc0 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
22cd0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29  h, MAXPATHLEN+5)
22ce0 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28 64 73  ;.    strlcat(ds
22cf0 74 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22  tWalPath, "-wal"
22d00 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b  , MAXPATHLEN+5);
22d10 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  ..    rc = unixO
22d20 70 65 6e 43 68 69 6c 64 46 69 6c 65 28 64 73 74  penChildFile(dst
22d30 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 7c  WalPath, O_RDWR|
22d40 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54 45 5f  O_CREAT, SQLITE_
22d50 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20 20 20 20 20  OPEN_WAL,.      
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 20 70 72 6f 74 46 6c 61 67 73 2c 20       protFlags, 
22d80 26 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20 20  &dstWalFD);.    
22d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22da0 4b 20 29 7b 0a 20 20 20 20 20 20 73 20 3d 20 63  K ){.      s = c
22db0 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
22dc0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73 65  loc();.      lse
22dd0 65 6b 28 73 72 63 57 61 6c 46 44 2c 20 30 2c 20  ek(srcWalFD, 0, 
22de0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
22df0 20 6c 73 65 65 6b 28 64 73 74 57 61 6c 46 44 2c   lseek(dstWalFD,
22e00 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
22e10 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69       if( fcopyfi
22e20 6c 65 28 73 72 63 57 61 6c 46 44 2c 20 64 73 74  le(srcWalFD, dst
22e30 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46 49  WalFD, s, COPYFI
22e40 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20  LE_DATA) ){.    
22e50 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
22e60 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  o;.        switc
22e70 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20  h(err) {.       
22e80 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a     case ENOMEM:.
22e90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22ea0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22eb0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
22ed0 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
22ee0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
22ef0 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20  pFile, err);.   
22f00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22f10 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
22f20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22f30 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61      copyfile_sta
22f40 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20 20  te_free(s);.    
22f50 20 20 63 6c 6f 73 65 28 64 73 74 57 61 6c 46 44    close(dstWalFD
22f60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  );.    }.    clo
22f70 73 65 28 73 72 63 57 61 6c 46 44 29 3b 0a 20 20  se(srcWalFD);.  
22f80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
22f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
22fa0 62 65 66 6f 72 65 20 77 65 20 63 6f 70 79 2c 20  before we copy, 
22fb0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
22fc0 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
22fd0 74 65 72 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69  ter will be modi
22fe0 66 69 65 64 20 2a 2f 0a 20 20 20 20 75 69 6e 74  fied */.    uint
22ff0 33 32 5f 74 20 73 72 63 43 68 61 6e 67 65 20 3d  32_t srcChange =
23000 20 30 3b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74   0;.    uint32_t
23010 20 64 73 74 43 68 61 6e 67 65 20 3d 20 30 3b 0a   dstChange = 0;.
23020 20 20 20 20 70 72 65 61 64 28 70 53 72 63 46 69      pread(pSrcFi
23030 6c 65 2d 3e 68 2c 20 26 73 72 63 43 68 61 6e 67  le->h, &srcChang
23040 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 70  e, 4, 24);.    p
23050 72 65 61 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26  read(pFile->h, &
23060 64 73 74 43 68 61 6e 67 65 2c 20 34 2c 20 32 34  dstChange, 4, 24
23070 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 63  );.    .    /* c
23080 6f 70 79 20 74 68 65 20 61 63 74 75 61 6c 20 64  opy the actual d
23090 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73  atabase */.    s
230a0 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
230b0 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 6c  e_alloc();.    l
230c0 73 65 65 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68  seek(pSrcFile->h
230d0 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
230e0 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d      lseek(pFile-
230f0 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  >h, 0, SEEK_SET)
23100 3b 0a 20 20 20 20 69 66 28 20 66 63 6f 70 79 66  ;.    if( fcopyf
23110 69 6c 65 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c  ile(pSrcFile->h,
23120 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f   pFile->h, s, CO
23130 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a  PYFILE_DATA) ){.
23140 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
23150 72 6e 6f 3b 0a 20 20 20 20 20 20 73 77 69 74 63  rno;.      switc
23160 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20  h(err) {.       
23170 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
23180 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23190 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
231a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
231b0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
231c0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
231d0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
231e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
231f0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
23200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23210 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65    copyfile_state
23220 5f 66 72 65 65 28 73 29 3b 0a 20 20 20 20 0a 20  _free(s);.    . 
23230 20 20 20 69 66 20 28 73 72 63 43 68 61 6e 67 65     if (srcChange
23240 20 3d 3d 20 64 73 74 43 68 61 6e 67 65 29 20 7b   == dstChange) {
23250 0a 20 20 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79  .      /* modify
23260 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
23270 74 65 72 20 74 6f 20 66 6f 72 63 65 20 70 61 67  ter to force pag
23280 65 20 7a 65 72 6f 20 74 6f 20 62 65 20 72 65 6c  e zero to be rel
23290 6f 61 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 64  oaded */.      d
232a0 73 74 43 68 61 6e 67 65 20 2b 2b 3b 0a 20 20 20  stChange ++;.   
232b0 20 20 20 70 77 72 69 74 65 28 70 46 69 6c 65 2d     pwrite(pFile-
232c0 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20  >h, &dstChange, 
232d0 34 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20  4, 24);.    }.  
232e0 7d 0a 20 20 69 66 28 20 69 73 53 72 63 43 6f 72  }.  if( isSrcCor
232f0 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rupt ){.    sqli
23300 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
23310 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f  ock_corrupt(src_
23320 66 69 6c 65 2c 20 63 6f 72 72 75 70 74 53 72 63  file, corruptSrc
23330 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  FileLock);.  }el
23340 73 65 7b 0a 20 20 20 20 2f 2a 20 64 6f 6e 65 20  se{.    /* done 
23350 77 69 74 68 20 74 68 65 20 73 6f 75 72 63 65 20  with the source 
23360 64 62 20 73 6f 20 65 6e 64 20 74 68 65 20 74 72  db so end the tr
23370 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  ansaction */.   
23380 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72   sqlite3_exec(sr
23390 63 64 62 32 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  cdb2, "COMMIT", 
233a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
233b0 2f 2a 20 7a 65 72 6f 20 6f 75 74 20 61 6e 79 20  /* zero out any 
233c0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6c 75 74  old journal clut
233d0 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ter */.  if( rc=
233e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
233f0 20 20 69 6e 74 20 73 6b 69 70 57 41 4c 20 3d 20    int skipWAL = 
23400 28 73 72 63 57 61 6c 46 44 3c 30 29 3f 30 3a 31  (srcWalFD<0)?0:1
23410 3b 0a 20 20 20 20 75 6e 69 78 49 6e 76 61 6c 69  ;.    unixInvali
23420 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73  dateSupportFiles
23430 28 70 46 69 6c 65 2c 20 73 6b 69 70 57 41 4c 29  (pFile, skipWAL)
23440 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 72 65 70  ;.  }.  .end_rep
23450 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3a 0a 20  lace_database:. 
23460 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29   if( pSrcBtree )
23470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
23480 6f 73 65 28 73 72 63 64 62 32 29 3b 0a 20 20 20  ose(srcdb2);.   
23490 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
234a0 76 65 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20  ve(pSrcBtree);. 
234b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
234c0 65 78 5f 6c 65 61 76 65 28 73 72 63 64 62 2d 3e  ex_leave(srcdb->
234d0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 69 73  mutex);.  if( is
234e0 44 73 74 43 6f 72 72 75 70 74 20 29 7b 0a 20 20  DstCorrupt ){.  
234f0 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
23500 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
23510 74 28 69 64 2c 20 63 6f 72 72 75 70 74 44 73 74  t(id, corruptDst
23520 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  FileLock);.  }el
23530 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64  se{.    sqlite3d
23540 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
23550 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  pLock);.  }.  re
23560 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 64 65 66 69  turn rc;.}.#defi
23570 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48  ne SQLITE_FILE_H
23580 45 41 44 45 52 5f 4c 45 4e 20 31 36 0a 2f 2a 20  EADER_LEN 16./* 
23590 43 68 65 63 6b 20 66 6f 72 20 61 20 63 6f 6e 66  Check for a conf
235a0 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 49  licting lock.  I
235b0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
235c0 70 72 69 6e 74 20 61 6e 20 74 68 69 73 0a 20 2a  print an this. *
235d0 2a 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75  * on standard ou
235e0 74 70 75 74 20 75 73 69 6e 67 20 74 68 65 20 66  tput using the f
235f0 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 67 69 76  ormat string giv
23600 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  en and return 1.
23610 0a 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  . ** If there ar
23620 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67  e no conflicting
23630 20 6c 6f 63 6b 73 2c 20 72 65 74 75 72 6e 20 30   locks, return 0
23640 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
23650 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 0a 20   unixIsLocked(. 
23660 20 70 69 64 5f 74 20 70 69 64 2c 20 20 20 20 20   pid_t pid,     
23670 20 20 20 20 20 20 20 2f 2a 20 50 49 44 20 74 6f         /* PID to
23680 20 74 65 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f   test for lock o
23690 77 6e 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  wner */.  int h,
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236b0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
236c0 6f 72 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  or to check */. 
236d0 20 69 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20   int type,      
236e0 20 20 20 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43         /* F_RDLC
236f0 4b 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  K or F_WRLCK */.
23700 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
23710 4f 66 73 74 2c 20 20 20 2f 2a 20 46 69 72 73 74  Ofst,   /* First
23720 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63   byte of the loc
23730 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
23740 69 6e 74 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20  int iCnt,    /* 
23750 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
23760 69 6e 20 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67  in the lock rang
23770 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
23780 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
23790 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a  Type of lock */.
237a0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
237b0 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b  k lk;.  int err;
237c0 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b  .  .  memset(&lk
237d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29  , 0, sizeof(lk))
237e0 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20  ;.  lk.l_type = 
237f0 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65  type;.  lk.l_whe
23800 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
23810 20 20 6c 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69    lk.l_start = i
23820 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e  Ofst;.  lk.l_len
23830 20 3d 20 69 43 6e 74 3b 0a 20 20 0a 20 20 69 66   = iCnt;.  .  if
23840 28 20 70 69 64 21 3d 53 51 4c 49 54 45 5f 4c 4f  ( pid!=SQLITE_LO
23850 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20 29  CKSTATE_ANYPID )
23860 7b 0a 23 69 66 6e 64 65 66 20 46 5f 47 45 54 4c  {.#ifndef F_GETL
23870 4b 50 49 44 0a 23 20 77 61 72 6e 69 6e 67 20 46  KPID.# warning F
23880 5f 47 45 54 4c 4b 50 49 44 20 75 6e 64 65 66 69  _GETLKPID undefi
23890 6e 65 64 2c 20 5f 73 71 6c 69 74 65 33 5f 6c 6f  ned, _sqlite3_lo
238a0 63 6b 73 74 61 74 65 20 66 61 6c 6c 69 6e 67 20  ckstate falling 
238b0 62 61 63 6b 20 74 6f 20 46 5f 47 45 54 4c 4b 0a  back to F_GETLK.
238c0 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28      err = fcntl(
238d0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29  h, F_GETLK, &lk)
238e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c  ;.#else.    lk.l
238f0 5f 70 69 64 20 3d 20 70 69 64 3b 0a 20 20 20 20  _pid = pid;.    
23900 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46  err = fcntl(h, F
23910 5f 47 45 54 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b  _GETLKPID, &lk);
23920 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
23930 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c  .    err = fcntl
23940 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b  (h, F_GETLK, &lk
23950 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20  );.  }.  .  if( 
23960 65 72 72 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  err==(-1) ){.   
23970 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
23980 20 22 66 63 6e 74 6c 28 25 64 29 20 66 61 69 6c   "fcntl(%d) fail
23990 65 64 3a 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c  ed: errno=%d\n",
239a0 20 68 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20   h, errno);.    
239b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
239c0 20 0a 20 20 69 66 28 20 6c 6b 2e 6c 5f 74 79 70   .  if( lk.l_typ
239d0 65 21 3d 46 5f 55 4e 4c 43 4b 20 26 26 20 28 70  e!=F_UNLCK && (p
239e0 69 64 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  id==SQLITE_LOCKS
239f0 54 41 54 45 5f 41 4e 59 50 49 44 20 7c 7c 20 6c  TATE_ANYPID || l
23a00 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64 29 20 29 7b  k.l_pid==pid) ){
23a10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23a20 45 42 55 47 0a 20 20 20 20 66 70 72 69 6e 74 66  EBUG.    fprintf
23a30 28 73 74 64 65 72 72 2c 20 22 25 73 20 6c 6f 63  (stderr, "%s loc
23a40 6b 20 68 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c  k held by %d\n",
23a50 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e   zType, (int)lk.
23a60 6c 5f 70 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20  l_pid);.#endif. 
23a70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23a80 20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a   .  return 0;.}.
23a90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23aa0 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69  LockstatePid(uni
23ab0 78 46 69 6c 65 20 2a 2c 20 70 69 64 5f 74 2c 20  xFile *, pid_t, 
23ac0 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e 64 69 66 20  int *);..#endif 
23ad0 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  /* (SQLITE_ENABL
23ae0 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
23af0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
23b00 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  E__) */.../*.** 
23b10 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
23b20 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
23b30 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
23b40 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
23b50 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
23b60 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
23b70 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
23b80 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
23b90 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
23ba0 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
23bb0 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
23bc0 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
23bd0 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
23be0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
23bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
23c00 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
23c10 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
23c20 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
23c30 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
23c40 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
23c50 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
23c60 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
23c70 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
23c80 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
23c90 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
23ca0 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
23cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
23cc0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
23cd0 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
23ce0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
23cf0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
23d00 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
23d10 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
23d20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
23d30 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
23d40 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
23d50 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
23d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23d70 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
23d80 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
23d90 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
23da0 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
23db0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
23dc0 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
23dd0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
23de0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
23df0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
23e00 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
23e10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
23e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23e30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
23e40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
23e50 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
23e60 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
23e70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
23e80 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
23e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ea0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
23eb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
23ec0 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
23ed0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
23ee0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
23ef0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23f00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
23f10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
23f20 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
23f30 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
23f40 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
23f50 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
23f60 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
23f70 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
23f80 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
23f90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
23fa0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
23fb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23fc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
23fd0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
23fe0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
23ff0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
24000 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
24010 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
24020 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
24030 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24040 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24050 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
24060 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
24070 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
24080 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
24090 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
240a0 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
240b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
240c0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
240d0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
240e0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
240f0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
24100 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
24110 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
24120 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
24130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24140 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24150 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
24160 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
24170 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71  har *zTFile = sq
24180 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46  lite3_malloc( pF
24190 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
241a0 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69  hname );.      i
241b0 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20  f( zTFile ){.   
241c0 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70       unixGetTemp
241d0 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
241e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
241f0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  File);.        *
24200 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
24210 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
24220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24230 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
24240 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24250 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a  TL_HAS_MOVED: {.
24260 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
24270 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  g = fileHasMoved
24280 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72  (pFile);.      r
24290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
242a0 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
242b0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
242c0 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
242d0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
242e0 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
242f0 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
24300 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
24310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24320 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
24330 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
24340 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
24350 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
24360 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
24370 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
24380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
24390 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
243a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
243b0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
243c0 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
243d0 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
243e0 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
243f0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
24400 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
24410 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
24420 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
24430 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
24440 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
24450 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
24460 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
24470 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
24480 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
24490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
244a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
244b0 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
244c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
244d0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
244e0 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
244f0 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
24500 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
24510 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
24520 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
24530 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
24540 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
24550 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
24560 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
24570 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
24580 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
24590 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
245a0 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
245b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
245c0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
245d0 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
245e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
245f0 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
24600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24610 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
24620 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
24630 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
24640 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
24650 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
24660 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
24670 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
24680 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24690 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_GET_LOCKPRO
246a0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
246b0 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
246c0 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
246d0 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
246e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
246f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24700 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
24710 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53  PLE__) */.#if (S
24720 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
24730 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
24740 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
24750 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24760 46 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45 5f 44  FCNTL_TRUNCATE_D
24770 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
24780 20 72 65 74 75 72 6e 20 75 6e 69 78 54 72 75 6e   return unixTrun
24790 63 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69  cateDatabase(pFi
247a0 6c 65 2c 20 28 70 41 72 67 20 3f 20 28 2a 28 69  le, (pArg ? (*(i
247b0 6e 74 20 2a 29 70 41 72 67 29 20 3a 20 30 29 29  nt *)pArg) : 0))
247c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
247d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 45   SQLITE_FCNTL_RE
247e0 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20  PLACE_DATABASE: 
247f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
24800 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61  nixReplaceDataba
24810 73 65 28 70 46 69 6c 65 2c 20 28 73 71 6c 69 74  se(pFile, (sqlit
24820 65 33 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  e3 *)pArg);.    
24830 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
24840 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
24850 45 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20 20 4c  E_PID: {.      L
24860 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 70 4c 6f  ockstatePID *pLo
24870 63 6b 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69  ckstate;.      i
24880 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 0a 20 20  nt rc;.      .  
24890 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
248a0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  LL ){.        re
248b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
248c0 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
248d0 20 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 28    pLockstate = (
248e0 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 29 70  LockstatePID *)p
248f0 41 72 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Arg;.      rc = 
24900 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
24910 28 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73 74 61  (pFile, pLocksta
24920 74 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f 63 6b  te->pid, &(pLock
24930 73 74 61 74 65 2d 3e 73 74 61 74 65 29 29 3b 0a  state->state));.
24940 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24950 0a 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23 65  .    }.      .#e
24960 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f  ndif /* (SQLITE_
24970 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
24980 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
24990 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
249a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
249b0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
249c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
249d0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
249e0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
249f0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
24a00 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
24a10 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
24a20 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
24a30 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
24a40 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
24a50 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
24a60 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
24a70 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
24a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
24a90 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
24aa0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
24ab0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
24ac0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
24ad0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
24ae0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
24af0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
24b00 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
24b10 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
24b20 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
24b30 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
24b40 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69   for both..*/.#i
24b50 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  fndef __QNXNTO__
24b60 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69   .static int uni
24b70 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
24b80 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
24b90 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
24ba0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
24bb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24bc0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
24bd0 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  SIZE;.}.#endif..
24be0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
24bf0 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75  ing version of u
24c00 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  nixSectorSize() 
24c10 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
24c20 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   QNX..*/.#ifdef 
24c30 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c  __QNXNTO__.#incl
24c40 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
24c50 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
24c60 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
24c70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
24c80 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
24c90 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
24ca0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
24cb0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
24cc0 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
24cd0 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20  rSize == 0 ){.  
24ce0 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73    struct statvfs
24cf0 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20   fsInfo;.       
24d00 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61  .    /* Set defa
24d10 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70  ults for non-sup
24d20 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65  ported filesyste
24d30 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ms */.    pFile-
24d40 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
24d50 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
24d60 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46  TOR_SIZE;.    pF
24d70 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
24d80 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
24d90 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73      if( fstatvfs
24da0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e  (pFile->h, &fsIn
24db0 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
24dc0 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
24dd0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
24de0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74    }..    if( !st
24df0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
24e00 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29  setype, "tmp") )
24e10 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
24e20 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
24e30 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
24e40 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
24e50 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24e60 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
24e70 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20  _IOCAP_ATOMIC4K 
24e80 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72  |       /* All r
24e90 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  am filesystem wr
24ea0 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
24eb0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
24ec0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
24ed0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
24ee0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
24ef0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
24f00 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
24f30 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
24f40 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
24f50 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
24f60 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
24f70 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
24f80 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
24f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fb0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
24fc0 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
24fd0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
24fe0 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
24ff0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
25000 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20   "etfs") ){.    
25010 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25020 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
25030 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
25040 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25050 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
25060 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74     /* etfs clust
25070 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61  er size writes a
25080 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
25090 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63       (pFile->sec
250a0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
250b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
250c0 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20  MIC512) |.      
250d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
250e0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
250f0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
25100 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
25110 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25140 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
25150 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
25160 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
25170 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
25180 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
25190 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
251a0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
251d0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
251e0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
251f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
25200 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
25210 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29  asetype, "qnx6")
25220 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
25230 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
25240 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
25250 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
25260 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25270 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
25280 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c  E_IOCAP_ATOMIC |
25290 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
252a0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
252b0 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
252c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
252d0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
252e0 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
252f0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
25300 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
25340 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
25350 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25360 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
25370 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
25380 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
25390 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
253d0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
253e0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
253f0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
25400 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
25410 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx4") ){.      
25420 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25430 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
25440 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
25450 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
25460 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
25470 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
25480 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
25490 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
254a0 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
254b0 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
254c0 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
254d0 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
254e0 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
254f0 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
25500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
25510 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
25520 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
25530 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
25540 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25570 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
25580 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
25590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
255a0 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
255b0 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b  etype, "dos") ){
255c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
255d0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
255e0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
255f0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
25600 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
25610 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
25620 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
25630 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
25640 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
25650 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
25660 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25670 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
25680 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
25690 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
256a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
256b0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
256c0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
256d0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
256e0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
25720 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
25730 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     0;.    }else{
25740 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
25750 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25760 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
25770 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25780 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62  C512 |      /* b
25790 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63  locks are atomic
257a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
257b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
257c0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
257d0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
257e0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
257f0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
25820 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
25830 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25840 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74   }.  }.  /* Last
25850 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61   chance verifica
25860 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
25870 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20  ctor size isn't 
25880 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31  a multiple of 51
25890 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  2.  ** then it i
258a0 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20  sn't valid.*/.  
258b0 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
258c0 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30  rSize % 512 != 0
258d0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
258e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
258f0 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46  tics = 0;.    pF
25900 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25910 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
25920 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
25930 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
25940 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a  ->sectorSize;.}.
25950 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e  #endif /* __QNXN
25960 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TO__ */../*.** R
25970 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
25980 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
25990 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
259a0 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
259b0 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
259c0 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
259d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
259e0 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
259f0 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
25a00 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61  choice is contra
25a10 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
25a20 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
25a30 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
25a40 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
25a50 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
25a60 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
25a70 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
25a80 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
25a90 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
25aa0 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
25ab0 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
25ac0 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
25ad0 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
25ae0 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
25af0 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
25b00 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
25b10 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
25b20 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
25b30 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
25b40 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
25b50 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
25b60 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
25b70 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
25b80 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
25b90 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
25ba0 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
25bb0 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
25bc0 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
25bd0 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
25be0 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
25bf0 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
25c00 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
25c10 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
25c20 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
25c30 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
25c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25c50 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
25c60 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
25c70 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
25c80 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
25c90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
25ca0 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  t rc = 0;.#ifdef
25cb0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66   __QNXNTO__.  if
25cc0 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  ( p->sectorSize=
25cd0 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53  =0 ) unixSectorS
25ce0 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20  ize(id);.  rc = 
25cf0 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  p->deviceCharact
25d00 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66  eristics;.#endif
25d10 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
25d20 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
25d30 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d  SOW ){.    rc |=
25d40 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
25d50 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
25d60 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
25d70 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
25d80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
25d90 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
25da0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a  AX_MMAP_SIZE>0..
25db0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25dc0 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   system page siz
25dd0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
25de0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
25df0 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65  t be called dire
25e00 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f  ctly by other co
25e10 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  de in this file.
25e20 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74   .** Instead, it
25e30 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
25e40 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65  d via macro osGe
25e50 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a  tpagesize()..*/.
25e60 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
25e70 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29  etpagesize(void)
25e80 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 42  {.#if defined(_B
25e90 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74  SD_SOURCE).  ret
25ea0 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28  urn getpagesize(
25eb0 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
25ec0 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f  n (int)sysconf(_
25ed0 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65  SC_PAGESIZE);.#e
25ee0 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ndif.}..#endif /
25ef0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
25f00 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
25f10 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
25f20 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65  IZE>0 */..#ifnde
25f30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
25f40 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  L../*.** Object 
25f50 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
25f60 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
25f70 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
25f80 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
25f90 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
25fa0 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
25fb0 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
25fc0 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
25fd0 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
25fe0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
25ff0 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
26000 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
26010 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
26020 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
26030 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
26040 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
26050 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
26060 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
26070 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
26080 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
26090 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
260a0 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
260b0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
260c0 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
260d0 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
260e0 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
260f0 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
26100 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
26110 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
26120 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
26130 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
26140 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
26150 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
26160 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
26170 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
26180 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
26190 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
261a0 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
261b0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
261c0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
261d0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
261e0 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
261f0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
26200 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
26210 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
26220 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
26230 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
26240 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
26250 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
26260 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
26270 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
26280 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
26290 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
262a0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
262b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
262c0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
262d0 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
262e0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
262f0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
26300 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
26310 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
26320 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
26330 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
26340 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
26350 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
26360 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
26370 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
26380 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
26390 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
263a0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
263b0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
263c0 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
263d0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
263e0 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
263f0 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
26400 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
26410 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
26420 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
26430 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
26440 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
26450 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
26460 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
26470 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
26480 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
26490 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
264a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
264b0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
264c0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
264d0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
264e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
264f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
26500 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
26510 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
26520 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26530 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
26540 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
26550 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
26560 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
26570 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
26580 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
26590 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
265a0 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
265b0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
265c0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265e0 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
265f0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
26600 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
26610 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
26630 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
26640 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
26650 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
26660 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
26670 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
26680 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
26690 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
266a0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
266b0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
266c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
266d0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
266e0 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
266f0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
26700 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
26710 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
26720 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
26730 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
26740 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
26750 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
26760 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
26770 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
26780 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
26790 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
267a0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
267b0 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
267c0 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
267d0 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
267e0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
267f0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
26800 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
26810 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
26820 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
26830 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
26840 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
26850 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
26860 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
26870 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
26880 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
26890 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
268a0 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
268b0 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
268c0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
268d0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
268e0 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
268f0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
26900 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
26910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
26920 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
26930 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
26940 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
26950 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
26960 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26970 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
26980 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
26990 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
269b0 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
269c0 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
269d0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
269e0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
269f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
26a00 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
26a10 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
26a20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
26a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26a40 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
26a50 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
26a60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
26a70 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
26a80 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
26a90 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
26aa0 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
26ab0 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
26ac0 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
26ad0 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
26ae0 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
26af0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
26b00 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
26b10 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
26b20 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
26b30 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
26b40 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
26b50 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
26b60 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
26b70 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
26b80 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
26b90 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
26ba0 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
26bb0 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
26bc0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
26bd0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
26be0 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  temLock(.  unixS
26bf0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
26c00 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  , /* Apply locks
26c10 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
26c20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
26c30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
26c40 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
26c50 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
26c60 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
26c70 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
26c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26c90 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
26ca0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
26cb0 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
26cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26cd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
26ce0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
26cf0 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
26d00 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
26d10 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
26d20 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
26d30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26d40 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  _OK;   /* Result
26d50 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
26d60 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
26d70 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
26d80 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
26d90 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
26da0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
26db0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26dc0 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
26dd0 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
26de0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
26df0 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
26e00 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
26e10 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
26e20 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
26e30 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65  n==1 || lockType
26e40 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20  !=F_RDLCK );..  
26e50 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74  /* Locks are wit
26e60 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  hin range */.  a
26e70 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e  ssert( n>=1 && n
26e80 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  <SQLITE_SHM_NLOC
26e90 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
26ea0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
26eb0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
26ec0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
26ed0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65  meters */.    me
26ee0 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65  mset(&f, 0, size
26ef0 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f  of(f));.    f.l_
26f00 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
26f10 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20  .    f.l_whence 
26f20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
26f30 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
26f40 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20  ;.    f.l_len = 
26f50 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  n;..    rc = osF
26f60 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
26f70 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
26f80 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
26f90 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
26fa0 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
26fb0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
26fc0 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
26fd0 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
26fe0 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
26ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27000 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
27010 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
27020 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
27030 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66   = ofst>31 ? 0xf
27040 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b  fff : (1<<(ofst+
27050 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
27060 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
27080 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
27090 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
270a0 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f  CE(("unlock %d o
270b0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
270c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
270d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
270e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
270f0 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
27100 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  sk;.    }else if
27110 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
27120 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
27130 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
27140 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
27150 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
27160 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
27170 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
27180 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c  de->sharedMask |
27190 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73  = mask;.    }els
271a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
271b0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
271c0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
271d0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
271e0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
271f0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
27200 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
27210 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
27220 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
27230 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
27240 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c  }else{.    if( l
27250 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
27260 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
27270 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61  E(("unlock %d fa
27280 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
27290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
272a0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
272b0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
272c0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c  ("read-lock fail
272d0 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
272e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
272f0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
27300 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
27310 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
27320 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
27330 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
27340 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74  OSTRACE((" - aft
27350 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33  erwards %03x,%03
27360 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
27370 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
27380 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d  dMask, pShmNode-
27390 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d  >exclMask));.  }
273a0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
273b0 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
273c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
273d0 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
273e0 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67   of 32KB shm reg
273f0 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64  ions that should
27400 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a   be mapped at.**
27410 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e   a time, assumin
27420 67 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70  g that each mapp
27430 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69  ing must be an i
27440 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
27450 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
27460 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69  t system page-si
27470 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  ze..**.** Usuall
27480 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68  y, this is 1. Th
27490 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d  e exception seem
274a0 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20  s to be systems 
274b0 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75  that are configu
274c0 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34  red.** to use 64
274d0 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68  KB pages - in th
274e0 69 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70  is case each map
274f0 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20  ping must cover 
27500 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20  at least two.** 
27510 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a  shm regions..*/.
27520 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
27530 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76  hmRegionPerMap(v
27540 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73  oid){.  int shms
27550 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20  z = 32*1024;    
27560 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72          /* SHM r
27570 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20  egion size */.  
27580 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74  int pgsz = osGet
27590 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a  pagesize();   /*
275a0 20 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   System page siz
275b0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  e */.  assert( (
275c0 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d  (pgsz-1)&pgsz)==
275d0 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73  0 );   /* Page s
275e0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
275f0 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66  wer of 2 */.  if
27600 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72  ( pgsz<shmsz ) r
27610 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
27620 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a  n pgsz/shmsz;.}.
27630 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
27640 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
27650 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
27660 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
27670 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
27680 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
27690 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
276a0 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
276b0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
276c0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
276d0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
276e0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
276f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
27700 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
27710 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
27720 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
27730 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
27740 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
27750 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
27760 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
27770 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
27780 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
27790 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
277a0 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ap();.    int i;
277b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
277c0 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
277d0 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
277e0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
277f0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
27800 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
27810 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
27820 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
27830 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
27840 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52   osMunmap(p->apR
27850 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
27860 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
27870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
27880 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
27890 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
278a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
278b0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
278c0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
278d0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
278e0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
278f0 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
27900 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
27910 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
27920 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
27930 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
27940 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
27950 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
27960 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
27970 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27980 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
27990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
279a0 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61  xySharedMemoryBa
279b0 73 65 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20  sePath(unixFile 
279c0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
279d0 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
279e0 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
279f0 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
27a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
27a10 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
27a20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
27a30 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
27a40 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
27a50 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
27a60 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
27a70 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
27a80 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
27a90 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
27aa0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
27ab0 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
27ac0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
27ad0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
27ae0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
27af0 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
27b00 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
27b10 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
27b20 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
27b30 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
27b40 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
27b50 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
27b60 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
27b70 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
27b80 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
27b90 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
27ba0 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
27bb0 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
27bc0 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
27bd0 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
27be0 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
27bf0 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
27c00 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
27c10 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
27c20 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
27c30 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
27c40 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
27c50 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
27c60 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
27c70 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
27c80 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
27c90 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
27ca0 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
27cb0 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
27cc0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
27cd0 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
27ce0 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
27cf0 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
27d00 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
27d10 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
27d20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
27d30 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
27d40 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
27d50 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
27d60 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
27d70 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
27d80 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
27d90 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
27da0 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
27db0 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
27dc0 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
27dd0 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
27de0 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
27df0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
27e00 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
27e10 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
27e20 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
27e30 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
27e40 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
27e50 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
27e60 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
27e70 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
27e80 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
27e90 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
27ea0 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
27eb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
27ec0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
27ed0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
27ee0 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
27ef0 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
27f00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
27f10 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
27f20 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
27f30 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
27f40 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
27f50 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
27f60 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
27f70 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
27f80 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
27f90 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
27fa0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
27fb0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
27fc0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
27fd0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
27fe0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
27ff0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
28000 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
28010 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
28020 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
28030 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
28040 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
28050 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
28060 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
28070 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
28080 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
28090 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
280a0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
280b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
280c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
280d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
280e0 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
280f0 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
28100 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
28110 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
28120 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
28130 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
28140 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
28150 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
28160 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
28170 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
28180 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
28190 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
281a0 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
281b0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
281c0 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
281d0 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
281e0 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
281f0 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
28200 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
28210 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
28220 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
28230 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
28240 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
28250 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
28260 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
28270 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
282a0 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
282b0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
282c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
282d0 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
282e0 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e   char *zShmFilen
282f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
28300 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
28310 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48  file used for SH
28320 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46  M */.  int nShmF
28330 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
28340 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
28350 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61  f the SHM filena
28360 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
28370 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
28380 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
28390 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20  unixShm object. 
283a0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
283b0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
283c0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
283d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
283e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
283f0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
28400 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p));.  assert( p
28410 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
28420 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
28430 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d  see if a unixShm
28440 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65  Node object alre
28450 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73  ady exists. Reus
28460 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  e an existing.  
28470 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e  ** one if presen
28480 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  t. Create a new 
28490 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
284a0 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
284b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
284c0 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
284d0 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  ode;.  pShmNode 
284e0 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  = pInode->pShmNo
284f0 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  de;.  if( pShmNo
28500 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  de==0 ){.    str
28510 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20  /* fstat() info 
28540 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
28550 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  e */.    const c
28560 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
28570 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 0a   pDbFd->zPath;..
28580 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
28590 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
285a0 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
285b0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
285c0 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
285d0 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
285e0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
285f0 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
28600 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
28610 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
28620 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
28630 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
28640 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
28650 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26  Fd->h, &sStat) &
28660 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  & pInode->bProce
28670 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
28680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
28690 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
286a0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
286b0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  err;.    }..#if 
286c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
286d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
286e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
286f0 45 0a 20 20 20 20 2f 2a 20 49 66 20 70 44 62 46  E.    /* If pDbF
28700 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  d is configured 
28710 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69  with proxy locki
28720 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74 68 65  ng mode, use the
28730 20 6c 6f 63 61 6c 20 0a 20 20 20 20 20 2a 2a 20   local .     ** 
28740 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
28750 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
28760 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a 20  -shm file path. 
28770 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28780 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
28790 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20  e(pDbFd) ){.    
287a0 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72    zBasePath = pr
287b0 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42  oxySharedMemoryB
287c0 61 73 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a  asePath(pDbFd);.
287d0 20 20 20 20 20 20 69 66 28 20 21 7a 42 61 73 65        if( !zBase
287e0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
287f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
28800 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
28810 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28820 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
28830 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a    }.#endif.    .
28840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
28850 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
28860 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
28870 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
28880 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
28890 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
288a0 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
288b0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65  int)strlen(zBase
288c0 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
288d0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
288e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
288f0 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
28900 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
28910 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
28920 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
28930 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
28940 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
28950 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
28960 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
28970 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
28980 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
28990 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
289a0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
289b0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
289c0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
289d0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
289e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
289f0 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
28a00 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
28a10 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
28a20 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
28a30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
28a40 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
28a50 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
28a60 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
28a70 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
28a80 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
28a90 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
28aa0 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
28ab0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
28ac0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
28ad0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
28ae0 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
28af0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
28b00 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
28b10 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
28b20 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
28b30 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
28b40 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
28b50 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
28b60 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
28b70 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
28b80 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
28b90 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
28ba0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
28bb0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
28bc0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
28bd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
28be0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
28bf0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
28c00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
28c10 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
28c20 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
28c30 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
28c40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
28c50 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
28c60 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20   | O_CREAT;.    
28c70 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
28c80 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
28c90 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
28ca0 79 5f 73 68 6d 22 2c 20 30 29 0a 23 69 66 20 64  y_shm", 0).#if d
28cb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
28cc0 41 42 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  ABLE_PERSIST_WAL
28cd0 29 26 26 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  )&&(SQLITE_ENABL
28ce0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
28cf0 5c 0a 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  \.    || defined
28d00 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
28d10 20 20 20 20 20 20 7c 7c 20 28 70 44 62 46 64 2d        || (pDbFd-
28d20 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 52  >openFlags & O_R
28d30 44 57 52 29 20 21 3d 20 4f 5f 52 44 57 52 0a 23  DWR) != O_RDWR.#
28d40 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 29  endif.         )
28d50 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c  {.        openFl
28d60 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
28d70 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
28d80 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31  ->isReadonly = 1
28d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28da0 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
28db0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
28dc0 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  lename, openFlag
28dd0 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64  s, (sStat.st_mod
28de0 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  e&0777));.      
28df0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
28e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
28e10 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
28e20 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
28e30 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
28e40 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
28e50 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
28e60 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  n_err;.      }..
28e70 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
28e80 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
28e90 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
28ea0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
28eb0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
28ec0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
28ed0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
28ee0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
28ef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
28f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28f10 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
28f20 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
28f30 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
28f40 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
28f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28f60 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
28f70 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
28f80 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
28f90 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
28fa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
28fb0 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
28fc0 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
28fd0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
28fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28ff0 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 61   /* If running a
29000 73 20 72 6f 6f 74 20 73 65 74 20 74 68 65 20 75  s root set the u
29010 69 64 2f 67 69 64 20 6f 66 20 74 68 65 20 73 68  id/gid of the sh
29020 6d 20 66 69 6c 65 20 74 6f 20 6d 61 74 63 68 0a  m file to match.
29030 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
29040 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
29050 20 20 20 20 20 20 20 75 69 64 5f 74 20 65 75 69         uid_t eui
29060 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b 0a 20  d = geteuid();. 
29070 20 20 20 20 20 20 20 20 20 69 66 28 20 28 21 70           if( (!p
29080 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
29090 6e 6c 79 29 20 26 26 20 65 75 69 64 3d 3d 30 20  nly) && euid==0 
290a0 26 26 20 28 65 75 69 64 21 3d 73 53 74 61 74 2e  && (euid!=sStat.
290b0 73 74 5f 75 69 64 20 7c 7c 20 67 65 74 65 67 69  st_uid || getegi
290c0 64 28 29 21 3d 73 53 74 61 74 2e 73 74 5f 67 69  d()!=sStat.st_gi
290d0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
290e0 20 20 69 66 28 20 6f 73 46 63 68 6f 77 6e 28 70    if( osFchown(p
290f0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
29100 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e  t.st_uid, sStat.
29110 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20  st_gid) ){.     
29120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
29130 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
29140 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EN;.            
29150 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
29160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29170 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
29180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29190 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
291a0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
291b0 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
291c0 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
291d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
291e0 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
291f0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
29200 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
29210 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
29220 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
29230 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
29240 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
29250 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
29260 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
29270 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
29280 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
29290 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
292a0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
292b0 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
292c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
292d0 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
292e0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
292f0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
29300 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
29310 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
29320 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
29330 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
29340 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
29350 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
29360 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
29370 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
29380 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
29390 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
293a0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
293b0 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
293c0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
293d0 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
293e0 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
293f0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
29400 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
29410 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
29420 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
29430 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
29440 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
29450 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
29460 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
29470 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
29480 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
29490 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
294a0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
294b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
294c0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
294d0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
294e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
294f0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
29500 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
29510 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
29520 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
29530 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
29540 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
29550 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
29560 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
29570 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
29580 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
29590 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
295a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
295b0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
295c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
295d0 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
295e0 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
295f0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
29600 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
29610 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
29620 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
29630 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
29640 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
29650 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
29660 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
29670 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
29680 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
29690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
296a0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
296b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
296c0 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
296d0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
296e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
296f0 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
29700 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
29710 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
29720 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
29730 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
29740 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
29750 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
29760 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
29770 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
29780 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
29790 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
297a0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
297b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
297c0 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
297d0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
297e0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
297f0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
29800 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
29810 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
29820 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
29830 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
29840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
29850 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
29860 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
29870 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
29880 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
29890 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
298a0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
298b0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
298c0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
298d0 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
298e0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
298f0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
29900 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
29910 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
29920 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
29930 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
29940 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29950 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
29960 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
29970 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
29980 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
29990 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
299a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
299b0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
299c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
299d0 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
299e0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
299f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29a00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
29a10 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
29a20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
29a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29a40 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
29a50 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
29a60 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
29a70 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
29a80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
29a90 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
29aa0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
29ab0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
29ac0 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
29ad0 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
29ae0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
29af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29b00 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61  .  int nShmPerMa
29b10 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
29b20 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74  nPerMap();.  int
29b30 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20   nReqRegion;..  
29b40 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  /* If the shared
29b50 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73  -memory file has
29b60 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
29b70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
29b80 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46  w. */.  if( pDbF
29b90 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20  d->pShm==0 ){.  
29ba0 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53    rc = unixOpenS
29bb0 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
29bc0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
29bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29be0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20  rn rc;.  }..  p 
29bf0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
29c00 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
29c10 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  ShmNode;.  sqlit
29c20 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
29c30 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
29c40 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
29c50 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
29c60 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
29c70 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
29c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
29c90 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
29ca0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
29cb0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
29cc0 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
29cd0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
29ce0 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
29cf0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
29d00 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
29d10 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
29d20 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Lock==0 );..  /*
29d30 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Minimum number 
29d40 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69  of regions requi
29d50 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64  red to be mapped
29d60 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f  . */.  nReqRegio
29d70 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53  n = ((iRegion+nS
29d80 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d  hmPerMap) / nShm
29d90 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65  PerMap) * nShmPe
29da0 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68  rMap;..  if( pSh
29db0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e  mNode->nRegion<n
29dc0 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  ReqRegion ){.   
29dd0 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29df0 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
29e00 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
29e10 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
29e20 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ReqRegion*szRegi
29e30 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  on;   /* Minimum
29e40 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
29e50 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
29e60 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e80 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
29e90 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
29ea0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
29eb0 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
29ec0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
29ed0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
29ee0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
29ef0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
29f00 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
29f10 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
29f20 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
29f30 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
29f40 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
29f50 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
29f60 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
29f70 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
29f80 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
29f90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
29fa0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
29fb0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
29fc0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
29fd0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
29fe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
29ff0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
2a000 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2a010 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
2a020 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
2a030 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
2a040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2a050 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
2a060 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
2a070 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
2a080 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
2a090 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
2a0a0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
2a0b0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
2a0c0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
2a0d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
2a0e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a0f0 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b   if( !bExtend ){
2a100 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2a110 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
2a120 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2a130 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  /* Alternatively
2a140 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
2a150 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65  true, extend the
2a160 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62   file. Do this b
2a170 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69  y.        ** wri
2a180 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
2a190 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  te to the end of
2a1a0 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20   each (OS) page 
2a1b0 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  being.        **
2a1c0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
2a1d0 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61  tended. Technica
2a1e0 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c  lly, we need onl
2a1f0 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  y write to the. 
2a200 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70         ** last p
2a210 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
2a220 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
2a230 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20   But writing to 
2a240 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20  all new.        
2a250 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20  ** pages forces 
2a260 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61  the OS to alloca
2a270 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74  te them immediat
2a280 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63  ely, which reduc
2a290 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
2a2a0 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47  e chances of SIG
2a2b0 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73  BUS while access
2a2c0 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72  ing the mapped r
2a2d0 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a  egion later on..
2a2e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a2f0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
2a300 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2a310 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b  int pgsz = 4096;
2a320 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2a330 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  Pg;..          /
2a340 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c  * Write to the l
2a350 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
2a360 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
2a370 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67   or extended pag
2a380 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  e */.          a
2a390 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20  ssert( (nByte % 
2a3a0 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pgsz)==0 );.    
2a3b0 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73        for(iPg=(s
2a3c0 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73  Stat.st_size/pgs
2a3d0 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70  z); iPg<(nByte/p
2a3e0 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  gsz); iPg++){.  
2a3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65            if( se
2a400 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68  ekAndWriteFd(pSh
2a410 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67  mNode->h, iPg*pg
2a420 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c  sz + pgsz-1, "",
2a430 20 31 2c 20 30 29 21 3d 31 20 29 7b 0a 20 20 20   1, 0)!=1 ){.   
2a440 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
2a450 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70   char *zFile = p
2a460 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
2a470 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2a480 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2a490 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2a4a0 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65  _SHMSIZE, "write
2a4b0 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
2a4c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
2a4d0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
2a4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2a510 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
2a520 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
2a530 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
2a540 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
2a550 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
2a560 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29  pNew = (char **)
2a570 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
2a580 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
2a590 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65  e->apRegion, nRe
2a5a0 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63  qRegion*sizeof(c
2a5b0 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20  har *).    );.  
2a5c0 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
2a5d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a5e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
2a5f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2a600 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2a610 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
2a620 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  ion = apNew;.   
2a630 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
2a640 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
2a650 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  gion ){.      in
2a660 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f  t nMap = szRegio
2a670 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  n*nShmPerMap;.  
2a680 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2a690 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
2a6a0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2a6b0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
2a6c0 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30   pMem = osMmap(0
2a6d0 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20  , nMap,.        
2a6e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
2a6f0 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f  Readonly ? PROT_
2a700 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44  READ : PROT_READ
2a710 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20  |PROT_WRITE, .  
2a720 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48            MAP_SH
2a730 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  ARED, pShmNode->
2a740 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34  h, szRegion*(i64
2a750 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  )pShmNode->nRegi
2a760 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  on.        );.  
2a770 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
2a780 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
2a790 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2a7a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2a7b0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22  _IOERR_SHMMAP, "
2a7c0 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d  mmap", pShmNode-
2a7d0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
2a7e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2a7f0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
2a800 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2a810 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73          pMem = s
2a820 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a  qlite3_malloc(sz
2a830 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
2a840 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
2a850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2a870 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2a880 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
2a890 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65   }.        memse
2a8a0 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67  t(pMem, 0, szReg
2a8b0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ion);.      }.. 
2a8c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2a8d0 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29  nShmPerMap; i++)
2a8e0 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
2a8f0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
2a900 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69  mNode->nRegion+i
2a910 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65  ] = &((char*)pMe
2a920 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a  m)[szRegion*i];.
2a930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
2a940 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20  hmNode->nRegion 
2a950 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  += nShmPerMap;. 
2a960 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
2a970 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
2a980 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
2a990 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
2a9a0 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
2a9b0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
2a9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2a9d0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
2a9e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
2a9f0 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
2aa00 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
2aa10 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
2aa20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2aa30 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
2aa40 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
2aa50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
2aa60 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
2aa70 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
2aa80 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
2aa90 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2aaa0 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
2aab0 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
2aac0 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
2aad0 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
2aae0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
2aaf0 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
2ab00 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
2ab10 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
2ab20 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
2ab30 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
2ab40 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
2ab50 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
2ab60 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
2ab70 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
2ab80 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
2ab90 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
2aba0 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
2abb0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2abc0 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
2abd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2abe0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
2abf0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
2ac00 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
2ac10 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
2ac20 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
2ac30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2ac40 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
2ac50 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
2ac60 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ac80 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
2ac90 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
2aca0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
2acb0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
2acc0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2acd0 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
2ace0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
2acf0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
2ad00 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
2ad10 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
2ad20 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
2ad30 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
2ad40 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
2ad50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ad60 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
2ad70 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
2ad80 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
2ad90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ada0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2adb0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
2adc0 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
2add0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
2ade0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
2adf0 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
2ae00 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
2ae10 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
2ae20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae40 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
2ae50 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2ae80 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
2ae90 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
2aea0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2aeb0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2aec0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
2aed0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2aee0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
2aef0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
2af00 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
2af10 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
2af20 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
2af30 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
2af40 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
2af50 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
2af60 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
2af70 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
2af80 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
2af90 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
2afa0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
2afb0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
2afc0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
2afd0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
2afe0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
2aff0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
2b000 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
2b010 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
2b020 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
2b030 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
2b040 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
2b050 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
2b060 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2b070 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
2b080 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2b090 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
2b0a0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
2b0b0 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
2b0c0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
2b0d0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
2b0e0 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
2b0f0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
2b100 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
2b110 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
2b120 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
2b130 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
2b140 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
2b150 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2b160 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
2b170 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
2b180 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
2b190 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
2b1a0 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
2b1b0 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
2b1c0 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
2b1d0 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
2b1e0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
2b1f0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
2b200 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
2b210 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
2b220 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
2b230 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
2b240 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
2b250 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
2b260 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
2b270 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
2b280 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
2b290 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
2b2a0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
2b2b0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2b2c0 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
2b2d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
2b2e0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
2b2f0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
2b300 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
2b310 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
2b320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2b350 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
2b360 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
2b370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b380 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
2b390 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
2b3a0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
2b3b0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
2b3c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
2b3d0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
2b3e0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
2b3f0 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
2b400 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
2b410 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
2b420 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
2b430 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
2b440 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
2b450 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
2b460 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
2b470 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
2b480 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
2b490 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
2b4a0 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
2b4b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
2b4c0 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
2b4d0 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
2b4e0 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
2b4f0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
2b500 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
2b510 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
2b520 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
2b530 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
2b540 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b550 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2b560 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b570 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
2b580 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
2b590 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
2b5a0 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
2b5b0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
2b5c0 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
2b5d0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
2b5e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b5f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
2b600 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
2b610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2b620 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
2b630 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
2b640 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
2b650 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
2b660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b670 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b680 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2b690 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
2b6a0 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
2b6b0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
2b6c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b6d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
2b6e0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
2b6f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b700 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2b710 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
2b720 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
2b730 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
2b740 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
2b750 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
2b760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2b770 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
2b780 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
2b790 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
2b7a0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
2b7b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
2b7c0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
2b7d0 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
2b7e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
2b7f0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
2b800 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2b810 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
2b820 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2b830 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
2b840 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2b850 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
2b860 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
2b870 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
2b880 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
2b890 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
2b8a0 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
2b8b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2b8c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b8d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2b8e0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
2b8f0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
2b900 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
2b910 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
2b920 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
2b940 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
2b950 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
2b960 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
2b970 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
2b980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b990 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
2b9a0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2b9b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
2b9c0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
2b9d0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
2b9e0 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
2b9f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
2ba00 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d  id, getpid(), p-
2ba10 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
2ba20 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
2ba30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ba40 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
2ba50 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
2ba60 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
2ba70 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
2ba80 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
2ba90 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
2baa0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
2bab0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
2bac0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
2bad0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
2bae0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
2baf0 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
2bb00 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
2bb10 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
2bb20 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
2bb30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2bb40 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
2bb50 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
2bb60 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
2bb70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
2bb80 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
2bb90 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  ex();.  unixLeav
2bba0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
2bbb0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
2bbc0 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
2bbd0 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
2bbe0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
2bbf0 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
2bc00 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
2bc10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
2bc20 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
2bc30 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
2bc40 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
2bc50 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
2bc60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
2bc70 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
2bc80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2bc90 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
2bca0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bcc0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
2bcd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2bce0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
2bd10 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
2bd20 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
2bd30 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
2bd40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd50 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
2bd60 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
2bd70 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
2bd80 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
2bd90 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
2bda0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
2bdb0 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
2bdc0 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
2bdd0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
2bde0 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
2bdf0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
2be00 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
2be10 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
2be20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
2be30 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
2be40 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
2be50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
2be60 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
2be70 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
2be80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2be90 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
2bea0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
2beb0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
2bec0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
2bed0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
2bee0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
2bef0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
2bf00 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
2bf10 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
2bf20 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
2bf30 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
2bf40 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
2bf50 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
2bf60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2bf70 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2bf80 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
2bf90 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
2bfa0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
2bfb0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
2bfc0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
2bfd0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
2bfe0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
2bff0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
2c000 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
2c010 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
2c020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2c030 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
2c040 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
2c050 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
2c060 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
2c070 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
2c080 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
2c090 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
2c0a0 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
2c0b0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
2c0c0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
2c0d0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
2c0e0 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
2c0f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
2c100 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
2c110 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
2c120 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 7b 0a 20  Node->h>=0 ) {. 
2c130 20 20 20 20 20 69 66 20 28 64 65 6c 65 74 65 46       if (deleteF
2c140 6c 61 67 20 3d 3d 20 31 29 20 7b 20 0a 20 20 20  lag == 1) { .   
2c150 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 53 68 6d       unlink(pShm
2c160 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
2c170 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69  ;.      } else i
2c180 66 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d  f (deleteFlag ==
2c190 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2) {.        /*
2c1a0 20 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e   ftruncate(pShmN
2c1b0 6f 64 65 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32  ode->h, 32 * 102
2c1c0 34 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  4); */.      }. 
2c1d0 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 75 6e     }.    .    un
2c1e0 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
2c1f0 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2c200 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
2c210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c220 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
2c230 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
2c240 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2c250 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
2c260 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
2c270 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
2c280 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
2c290 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
2c2a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c2b0 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 28 53 51 4c  WAL */..#if (SQL
2c2c0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
2c2d0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
2c2e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74  ed(__APPLE__).st
2c2f0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c300 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
2c310 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20  (void);..static 
2c320 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
2c330 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
2c340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2c350 69 6e 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20  int skipWAL) {. 
2c360 20 63 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50   char jPath[MAXP
2c370 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74  ATHLEN+9];.  int
2c380 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28   zLen = strlcpy(
2c390 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  jPath, pFile->zP
2c3a0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  ath, MAXPATHLEN+
2c3b0 39 29 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d  9);.  if( zLen<M
2c3c0 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
2c3d0 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20   size_t jLen;.  
2c3e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74    const char ext
2c3f0 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20  ensions[3][9] = 
2c400 7b 20 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72  { "-wal", "-jour
2c410 6e 61 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a  nal", "-shm" };.
2c420 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69      int j = (ski
2c430 70 57 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20  pWAL ? 1 : 0);. 
2c440 20 20 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a     for( ; j<3; j
2c450 2b 2b 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20  ++ ){.      .   
2c460 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2c470 65 65 20 69 66 20 74 68 65 20 73 68 6d 20 66 69  ee if the shm fi
2c480 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
2c490 65 6e 65 64 20 66 6f 72 20 74 68 69 73 20 70 46  ened for this pF
2c4a0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ile */.      if(
2c4b0 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
2c4c0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2c4d0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
2c4e0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
2c4f0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
2c500 65 61 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eads */.        
2c510 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2c520 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
2c530 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
2c540 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68  .        if( pSh
2c550 6d 4e 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f  mNode && !pShmNo
2c560 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29  de->isReadonly )
2c570 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2c580 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20  ct stat sStat;. 
2c590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c5a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2c5b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2c5c0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c5d0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
2c5e0 2d 3e 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74  ->h>=0 && !osFst
2c5f0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
2c600 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2c610 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2c620 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74  long size = (sSt
2c630 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20  at.st_size<4) ? 
2c640 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20  sStat.st_size : 
2c650 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  4;.            i
2c660 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
2c670 20 20 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f             bzero
2c680 28 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67  (pShmNode->apReg
2c690 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20  ion[0], size);. 
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c6b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2c6c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2c6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2c6e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c6f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2c700 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2c730 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2c740 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
2c750 65 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ex);.        }. 
2c760 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
2c770 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d  Mutex();.      }
2c780 0a 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74  .      jLen = st
2c790 72 6c 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65  rlcpy(&jPath[zLe
2c7a0 6e 5d 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a  n], extensions[j
2c7b0 5d 2c 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 9);.      if(
2c7c0 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20   jLen < 9 ){.   
2c7d0 20 20 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20       int jflags 
2c7e0 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e  = (j<2) ? O_TRUN
2c7f0 43 20 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20  C : O_RDWR;.    
2c800 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70      int jfd = op
2c810 65 6e 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73  en(jPath, jflags
2c820 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
2c830 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  fd==(-1) ){.    
2c840 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21        if( errno!
2c850 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
2c860 20 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50         perror(jP
2c870 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
2c880 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
2c890 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
2c8a0 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
2c8b0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2c8c0 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20   sStat;.        
2c8d0 20 20 20 20 69 66 28 20 21 6f 73 46 73 74 61 74      if( !osFstat
2c8e0 28 6a 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b  (jfd, &sStat) ){
2c8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
2c900 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a  nsigned long siz
2c910 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69  e = (sStat.st_si
2c920 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74  ze<4) ? sStat.st
2c930 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20  _size : 4;.     
2c940 20 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a           if( siz
2c950 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
2c960 20 20 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20         uint32_t 
2c970 7a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  zero = 0;.      
2c980 20 20 20 20 20 20 20 20 20 20 70 77 72 69 74 65            pwrite
2c990 28 6a 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69  (jfd, &zero, (si
2c9a0 7a 65 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20  ze_t)size, 0);. 
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c9c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c9d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c9e0 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20     fsync(jfd);. 
2c9f0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a           close(j
2ca00 66 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fd);.        }. 
2ca10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ca20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ca30 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
2ca40 6e 74 20 75 6e 69 78 55 6e 73 61 66 65 54 72 75  nt unixUnsafeTru
2ca50 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e  ncateDatabase(un
2ca60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
2ca70 20 20 2f 2a 20 74 68 69 73 20 69 73 20 6e 61 73    /* this is nas
2ca80 74 79 20 26 20 62 61 64 2e 20 20 64 65 73 74 72  ty & bad.  destr
2ca90 75 63 74 69 6f 6e 20 77 69 74 68 20 70 72 65 6a  uction with prej
2caa0 75 64 69 63 65 2e 20 20 77 65 27 6c 6c 20 6c 6f  udice.  we'll lo
2cab0 73 65 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  se all the.  ** 
2cac0 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 20 74 68  file locks in th
2cad0 69 73 20 70 72 6f 63 65 73 73 2c 20 68 6f 77 65  is process, howe
2cae0 76 65 72 2e 20 73 71 6c 69 74 65 33 5f 66 69 6c  ver. sqlite3_fil
2caf0 65 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  e_control works 
2cb00 70 72 6f 70 65 72 6c 79 2e 0a 20 20 2a 2a 20 42  properly..  ** B
2cb10 75 74 20 69 66 20 69 74 20 66 61 69 6c 73 2c 20  ut if it fails, 
2cb20 74 68 69 73 20 77 6f 72 6b 73 20 61 70 70 72 6f  this works appro
2cb30 78 69 6d 61 74 65 6c 79 0a 20 20 2a 2f 0a 20 20  ximately.  */.  
2cb40 63 68 61 72 20 6a 6f 75 72 6e 61 6c 50 61 74 68  char journalPath
2cb50 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2cb60 63 68 61 72 20 77 61 6c 50 61 74 68 5b 4d 41 58  char walPath[MAX
2cb70 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2cb80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cb90 20 20 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a    .#ifdef DEBUG.
2cba0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2cbb0 2c 20 22 46 6f 72 63 65 20 74 72 75 6e 63 61 74  , "Force truncat
2cbc0 69 6e 67 20 64 61 74 61 62 61 73 65 20 25 73 5c  ing database %s\
2cbd0 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
2cbe0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 6c  );.#endif.  strl
2cbf0 63 70 79 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c  cpy(journalPath,
2cc00 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
2cc10 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74  AXPATHLEN);.  st
2cc20 72 6c 63 61 74 28 6a 6f 75 72 6e 61 6c 50 61 74  rlcat(journalPat
2cc30 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d  h, "-journal", M
2cc40 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74  AXPATHLEN);.  st
2cc50 72 6c 63 70 79 28 77 61 6c 50 61 74 68 2c 20 70  rlcpy(walPath, p
2cc60 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2cc70 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c  PATHLEN);.  strl
2cc80 63 61 74 28 77 61 6c 50 61 74 68 2c 20 22 2d 77  cat(walPath, "-w
2cc90 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  al", MAXPATHLEN)
2cca0 3b 0a 20 20 69 6e 74 20 66 64 31 20 3d 20 70 46  ;.  int fd1 = pF
2ccb0 69 6c 65 2d 3e 68 3b 0a 20 20 69 6e 74 20 72 65  ile->h;.  int re
2ccc0 73 75 6c 74 20 3d 20 30 3b 0a 20 20 72 65 73 75  sult = 0;.  resu
2ccd0 6c 74 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  lt = ftruncate(f
2cce0 64 31 2c 20 30 6c 6c 29 3b 0a 20 20 69 66 20 28  d1, 0ll);.  if (
2ccf0 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 65  result) {.    re
2cd00 73 75 6c 74 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  sult = errno;.  
2cd10 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29 20  }.  if (result) 
2cd20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2cd30 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f  E_IOERR;.    sto
2cd40 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2cd50 65 2c 20 72 65 73 75 6c 74 29 3b 0a 20 20 7d 0a  e, result);.  }.
2cd60 20 20 0a 20 20 69 6e 74 20 66 64 32 20 3d 20 6f    .  int fd2 = o
2cd70 70 65 6e 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c  pen(journalPath,
2cd80 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20   O_RDWR);.  int 
2cd90 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20 20 69  result2 = 0;.  i
2cda0 66 20 28 66 64 32 20 3c 20 30 29 20 7b 0a 20 20  f (fd2 < 0) {.  
2cdb0 20 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45    if (errno != E
2cdc0 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72  NOENT) {.      r
2cdd0 65 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a  esult2 = errno;.
2cde0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2cdf0 20 20 20 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a     result2 = 0;.
2ce00 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
2ce10 0a 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 66  .    result2 = f
2ce20 74 72 75 6e 63 61 74 65 28 66 64 32 2c 20 30 6c  truncate(fd2, 0l
2ce30 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75  l);.    if (resu
2ce40 6c 74 32 29 20 7b 0a 20 20 20 20 20 20 72 65 73  lt2) {.      res
2ce50 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  ult2 = errno;.  
2ce60 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65    }.  }.  if (re
2ce70 73 75 6c 74 32 20 26 26 20 21 72 65 73 75 6c 74  sult2 && !result
2ce80 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ) {.    rc = SQL
2ce90 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73  ITE_IOERR;.    s
2cea0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
2ceb0 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20  ile, result2);. 
2cec0 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 33 20   }.  .  int fd3 
2ced0 3d 20 6f 70 65 6e 28 77 61 6c 50 61 74 68 2c 20  = open(walPath, 
2cee0 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20 72  O_RDWR);.  int r
2cef0 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20 69 66  esult3 = 0;.  if
2cf00 20 28 66 64 33 20 3c 20 30 29 20 7b 0a 20 20 20   (fd3 < 0) {.   
2cf10 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e   if (errno != EN
2cf20 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72 65  OENT) {.      re
2cf30 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20  sult3 = errno;. 
2cf40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2cf50 20 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20    result3 = 0;. 
2cf60 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
2cf70 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 66 74      result3 = ft
2cf80 72 75 6e 63 61 74 65 28 66 64 33 2c 20 30 6c 6c  runcate(fd3, 0ll
2cf90 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
2cfa0 74 33 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75  t3) {.      resu
2cfb0 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  lt3 = errno;.   
2cfc0 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73   }.  }.  if (res
2cfd0 75 6c 74 33 20 26 26 20 21 28 72 65 73 75 6c 74  ult3 && !(result
2cfe0 20 7c 7c 20 72 65 73 75 6c 74 32 29 29 20 7b 0a   || result2)) {.
2cff0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d000 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65  IOERR;.    store
2d010 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
2d020 20 72 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20   result2);.  }. 
2d030 20 0a 20 20 69 66 20 28 66 64 33 20 3e 3d 20 30   .  if (fd3 >= 0
2d040 29 20 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64  ) {.    fsync(fd
2d050 33 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  3);.    close(fd
2d060 33 29 3b 0a 20 20 7d 0a 20 20 69 66 20 28 66 64  3);.  }.  if (fd
2d070 32 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73  2 >= 0) {.    fs
2d080 79 6e 63 28 66 64 32 29 3b 0a 20 20 20 20 63 6c  ync(fd2);.    cl
2d090 6f 73 65 28 66 64 32 29 3b 0a 20 20 7d 0a 20 20  ose(fd2);.  }.  
2d0a0 66 73 79 6e 63 28 66 64 31 29 3b 0a 09 0a 20 20  fsync(fd1);...  
2d0b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
2d0c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
2d0d0 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e  ncateDatabase(un
2d0e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
2d0f0 6e 74 20 62 46 6c 61 67 73 29 20 7b 0a 20 20 73  nt bFlags) {.  s
2d100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20  qlite3_file *id 
2d110 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
2d120 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  *)pFile;.  int r
2d130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d140 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e   void *pLock = N
2d150 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  ULL;.  int flags
2d160 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72   = 0;.  int corr
2d170 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b  uptFileLock = 0;
2d180 0a 20 20 69 6e 74 20 69 73 43 6f 72 72 75 70 74  .  int isCorrupt
2d190 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6f 72 63   = 0;.  int forc
2d1a0 65 20 3d 20 28 62 46 6c 61 67 73 20 26 20 53 51  e = (bFlags & SQ
2d1b0 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 46 4f  LITE_TRUNCATE_FO
2d1c0 52 43 45 29 3b 0a 20 20 69 6e 74 20 73 61 66 65  RCE);.  int safe
2d1d0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 23 69 66  Failed = 0;..#if
2d1e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
2d1f0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
2d200 20 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d   flags |= pFile-
2d210 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64  >protFlags;.#end
2d220 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2d230 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d240 4c 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79  LE.  if( isProxy
2d250 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c  LockingMode(pFil
2d260 65 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  e) ){.    flags 
2d270 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41  |= SQLITE_OPEN_A
2d280 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65  UTOPROXY;.  }.#e
2d290 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73  ndif.  .  rc = s
2d2a0 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2d2b0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  lock(pFile->zPat
2d2c0 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20  h, 0, flags, 0, 
2d2d0 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66  0, &pLock);.  if
2d2e0 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
2d2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
2d300 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
2d310 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
2d320 20 69 73 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a   isCorrupt = 1;.
2d330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d340 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
2d350 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c  _corrupt(id, SQL
2d360 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
2d370 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  VE,.            
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f               &co
2d3a0 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  rruptFileLock);.
2d3b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d3c0 20 26 26 20 21 66 6f 72 63 65 20 29 7b 0a 20 20   && !force ){.  
2d3d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d3e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51     }.    rc = SQ
2d3f0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 49 67 6e 6f  LITE_OK; /* Igno
2d400 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 66  re the locking f
2d410 61 69 6c 75 72 65 20 69 66 20 66 6f 72 63 65 20  ailure if force 
2d420 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 7d 0a 20  is true */.  }. 
2d430 20 69 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c   if( (bFlags&SQL
2d440 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 49 4e 49  ITE_TRUNCATE_INI
2d450 54 49 41 4c 49 5a 45 5f 48 45 41 44 45 52 5f 4d  TIALIZE_HEADER_M
2d460 41 53 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  ASK)!=0 ){.    /
2d470 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  * initialize a n
2d480 65 77 20 64 61 74 61 62 61 73 65 20 69 6e 20 54  ew database in T
2d490 4d 50 44 49 52 20 61 6e 64 20 63 6f 70 79 20 74  MPDIR and copy t
2d4a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 76 65 72  he contents over
2d4b0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
2d4c0 61 72 20 2a 74 44 69 72 20 3d 20 75 6e 69 78 54  ar *tDir = unixT
2d4d0 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20  empFileDir();.  
2d4e0 20 20 69 6e 74 20 74 44 69 72 4c 65 6e 20 3d 20    int tDirLen = 
2d4f0 73 74 72 6c 65 6e 28 74 44 69 72 29 3b 0a 20 20  strlen(tDir);.  
2d500 20 20 69 6e 74 20 74 4c 65 6e 20 3d 20 73 69 7a    int tLen = siz
2d510 65 6f 66 28 63 68 61 72 29 20 2a 20 28 74 44 69  eof(char) * (tDi
2d520 72 4c 65 6e 20 2b 20 31 32 29 3b 0a 20 20 20 20  rLen + 12);.    
2d530 63 68 61 72 20 2a 74 44 62 50 61 74 68 20 3d 20  char *tDbPath = 
2d540 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 74  (char *)malloc(t
2d550 4c 65 6e 29 3b 0a 20 20 20 20 69 6e 74 20 74 46  Len);.    int tF
2d560 64 20 3d 20 2d 31 3b 0a 20 20 20 20 0a 20 20 20  d = -1;.    .   
2d570 20 73 74 72 6c 63 70 79 28 74 44 62 50 61 74 68   strlcpy(tDbPath
2d580 2c 20 74 44 69 72 2c 20 74 4c 65 6e 29 3b 0a 20  , tDir, tLen);. 
2d590 20 20 20 69 66 28 20 74 44 62 50 61 74 68 5b 28     if( tDbPath[(
2d5a0 74 44 69 72 4c 65 6e 2d 31 29 5d 20 21 3d 20 27  tDirLen-1)] != '
2d5b0 2f 27 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6c  /' ){.      strl
2d5c0 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 2f 74  cat(tDbPath, "/t
2d5d0 6d 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e  mpdbXXXXX", tLen
2d5e0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
2d5f0 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 74 44        strlcat(tD
2d600 62 50 61 74 68 2c 20 22 74 6d 70 64 62 58 58 58  bPath, "tmpdbXXX
2d610 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20  XX", tLen);.    
2d620 7d 0a 20 20 20 20 74 46 64 20 3d 20 6d 6b 73 74  }.    tFd = mkst
2d630 65 6d 70 28 74 44 62 50 61 74 68 29 3b 0a 20 20  emp(tDbPath);.  
2d640 20 20 69 66 28 20 74 46 64 3d 3d 2d 31 20 29 7b    if( tFd==-1 ){
2d650 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
2d660 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
2d670 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
2d680 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2d690 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d      safeFailed =
2d6a0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2d6b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 74 44       sqlite3 *tD
2d6c0 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  b = NULL;.      
2d6d0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
2d6e0 20 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 72   s;.      int tr
2d6f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
2d700 5f 76 32 28 74 44 62 50 61 74 68 2c 20 26 74 44  _v2(tDbPath, &tD
2d710 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2d720 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
2d730 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
2d740 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2d750 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
2d760 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
2d770 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2d780 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 63  , NULL);.      c
2d790 68 61 72 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55  har *errmsg = NU
2d7a0 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  LL;.      const 
2d7b0 63 68 61 72 20 2a 73 71 6c 20 3d 20 22 22 3b 0a  char *sql = "";.
2d7c0 20 20 20 20 20 20 69 66 28 20 21 74 72 63 20 26        if( !trc &
2d7d0 26 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45  & (bFlags&SQLITE
2d7e0 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
2d7f0 5a 45 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20  ZE_MASK) ){.    
2d800 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 70      const char p
2d810 61 67 65 73 69 7a 65 5f 73 71 6c 5b 34 5d 5b 32  agesize_sql[4][2
2d820 32 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  2] = {.         
2d830 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69   "pragma page_si
2d840 7a 65 3d 31 30 32 34 22 2c 0a 20 20 20 20 20 20  ze=1024",.      
2d850 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2d860 5f 73 69 7a 65 3d 32 30 34 38 22 2c 0a 20 20 20  _size=2048",.   
2d870 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2d880 61 67 65 5f 73 69 7a 65 3d 34 30 39 36 22 2c 0a  age_size=4096",.
2d890 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2d8a0 61 20 70 61 67 65 5f 73 69 7a 65 3d 38 31 39 32  a page_size=8192
2d8b0 22 20 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  " .        };.  
2d8c0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 73        int iPages
2d8d0 69 7a 65 20 3d 20 28 28 28 62 46 6c 61 67 73 26  ize = (((bFlags&
2d8e0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2d8f0 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 3e  PAGESIZE_MASK) >
2d900 3e 20 34 29 20 2d 20 31 29 3b 0a 20 20 20 20 20  > 4) - 1);.     
2d910 20 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65     assert( iPage
2d920 73 69 7a 65 3e 3d 30 20 26 26 20 69 50 61 67 65  size>=0 && iPage
2d930 73 69 7a 65 3c 3d 34 20 29 3b 0a 20 20 20 20 20  size<=4 );.     
2d940 20 20 20 73 71 6c 20 3d 20 70 61 67 65 73 69 7a     sql = pagesiz
2d950 65 5f 73 71 6c 5b 69 50 61 67 65 73 69 7a 65 5d  e_sql[iPagesize]
2d960 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2d970 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2d980 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2d990 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2d9a0 20 20 20 20 20 69 66 28 20 21 74 72 63 20 29 7b       if( !trc ){
2d9b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2d9c0 68 61 72 20 61 75 74 6f 76 61 63 75 75 6d 5f 73  har autovacuum_s
2d9d0 71 6c 5b 33 5d 5b 32 31 5d 20 3d 20 7b 0a 20 20  ql[3][21] = {.  
2d9e0 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20          "pragma 
2d9f0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 30 22 2c 0a  auto_vacuum=0",.
2da00 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2da10 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 31 22  a auto_vacuum=1"
2da20 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61  ,.          "pra
2da30 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d  gma auto_vacuum=
2da40 32 22 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  2".        };.  
2da50 20 20 20 20 20 20 69 6e 74 20 69 41 75 74 6f 76        int iAutov
2da60 61 63 75 75 6d 20 3d 20 32 3b 20 2f 2a 20 64 65  acuum = 2; /* de
2da70 66 61 75 6c 74 20 74 6f 20 69 6e 63 72 65 6d 65  fault to increme
2da80 6e 74 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  ntal */.        
2da90 69 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c 49  if( (bFlags&SQLI
2daa0 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f  TE_TRUNCATE_AUTO
2dab0 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20 29 7b 0a  VACUUM_MASK) ){.
2dac0 20 20 20 20 20 20 20 20 20 20 69 41 75 74 6f 76            iAutov
2dad0 61 63 75 75 6d 20 3d 20 28 28 28 62 46 6c 61 67  acuum = (((bFlag
2dae0 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2daf0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
2db00 4b 29 20 3e 3e 20 32 29 20 2d 20 31 29 3b 0a 20  K) >> 2) - 1);. 
2db10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db20 20 61 73 73 65 72 74 28 20 69 41 75 74 6f 76 61   assert( iAutova
2db30 63 75 75 6d 3e 3d 30 20 26 26 20 69 41 75 74 6f  cuum>=0 && iAuto
2db40 76 61 63 75 75 6d 3c 3d 32 20 29 3b 0a 20 20 20  vacuum<=2 );.   
2db50 20 20 20 20 20 73 71 6c 20 3d 20 61 75 74 6f 76       sql = autov
2db60 61 63 75 75 6d 5f 73 71 6c 5b 69 41 75 74 6f 76  acuum_sql[iAutov
2db70 61 63 75 75 6d 5d 3b 0a 20 20 20 20 20 20 20 20  acuum];.        
2db80 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
2db90 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
2dba0 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
2dbb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2dbc0 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26 53  trc && (bFlags&S
2dbd0 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 4a  QLITE_TRUNCATE_J
2dbe0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 20  OURNALMODE_WAL) 
2dbf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  ){.        sql =
2dc00 20 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c   "pragma journal
2dc10 5f 6d 6f 64 65 3d 77 61 6c 22 3b 0a 20 20 20 20  _mode=wal";.    
2dc20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65      trc = sqlite
2dc30 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c  3_exec(tDb, sql,
2dc40 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b   0, 0, &errmsg);
2dc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dc60 66 28 20 74 72 63 20 29 7b 0a 20 20 20 20 20 20  f( trc ){.      
2dc70 20 20 69 66 28 20 21 74 44 62 20 29 7b 0a 20 20    if( !tDb ){.  
2dc80 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2dc90 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
2dca0 74 6f 20 6f 70 65 6e 20 74 65 6d 70 20 64 61 74  to open temp dat
2dcb0 61 62 61 73 65 20 27 25 73 27 20 74 6f 20 72 65  abase '%s' to re
2dcc0 73 65 74 20 22 0a 20 20 20 20 20 20 20 20 20 20  set ".          
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dce0 22 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62  "truncated datab
2dcf0 61 73 65 20 25 73 20 77 69 74 68 20 66 6c 61 67  ase %s with flag
2dd00 73 20 25 78 3a 20 25 64 5c 6e 22 2c 0a 20 20 20  s %x: %d\n",.   
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd20 20 20 20 20 20 20 20 20 74 44 62 50 61 74 68 2c          tDbPath,
2dd30 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 62   pFile->zPath, b
2dd40 46 6c 61 67 73 2c 20 74 72 63 29 3b 0a 20 20 20  Flags, trc);.   
2dd50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dd60 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
2dd70 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
2dd80 20 73 65 74 20 27 25 73 27 20 6f 6e 20 74 72 75   set '%s' on tru
2dd90 6e 63 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ncated database 
2dda0 25 73 2c 20 25 64 3a 20 22 0a 20 20 20 20 20 20  %s, %d: ".      
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 22 25 73 5c 6e 22 2c 20 73 71 6c 2c      "%s\n", sql,
2ddd0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 74   pFile->zPath, t
2dde0 72 63 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 20  rc, errmsg);.   
2ddf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2de00 20 20 20 20 20 69 66 28 20 74 44 62 20 29 7b 0a       if( tDb ){.
2de10 20 20 20 20 20 20 20 20 69 6e 74 20 6f 66 66 20          int off 
2de20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
2de30 6d 65 72 67 65 20 74 68 65 20 77 61 6c 20 69 6e  merge the wal in
2de40 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 20  to the db */.   
2de50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2de60 65 5f 63 6f 6e 74 72 6f 6c 28 74 44 62 2c 20 4e  e_control(tDb, N
2de70 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
2de80 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 26  L_PERSIST_WAL, &
2de90 6f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  off);.        sq
2dea0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 74 44 62 29  lite3_close(tDb)
2deb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dec0 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61  s = copyfile_sta
2ded0 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  te_alloc();.    
2dee0 20 20 6c 73 65 65 6b 28 74 46 64 2c 20 30 2c 20    lseek(tFd, 0, 
2def0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
2df00 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c   lseek(pFile->h,
2df10 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
2df20 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69       if( fcopyfi
2df30 6c 65 28 74 46 64 2c 20 70 46 69 6c 65 2d 3e 68  le(tFd, pFile->h
2df40 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41  , s, COPYFILE_DA
2df50 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  TA) ){.        i
2df60 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2df70 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72        switch(err
2df80 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ) {.          ca
2df90 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
2dfa0 20 20 20 20 20 20 20 74 72 63 20 3d 20 53 51 4c         trc = SQL
2dfb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2dfc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dfd0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2dfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
2dff0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2e000 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20  e, err);.       
2e010 20 20 20 20 20 74 72 63 20 3d 20 53 51 4c 49 54       trc = SQLIT
2e020 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
2e030 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e040 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
2e050 66 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 66  free(s);.      f
2e060 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  sync(pFile->h);.
2e070 20 20 20 20 20 20 63 6c 6f 73 65 28 74 46 64 29        close(tFd)
2e080 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74  ;.      unlink(t
2e090 44 62 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69  DbPath);.      i
2e0a0 66 28 20 74 72 63 21 3d 53 51 4c 49 54 45 5f 4f  f( trc!=SQLITE_O
2e0b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 61 66  K ){.        saf
2e0c0 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2e0d0 20 20 20 20 20 72 63 20 3d 20 74 72 63 3b 0a 20       rc = trc;. 
2e0e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e0f0 20 66 72 65 65 28 74 44 62 50 61 74 68 29 3b 0a   free(tDbPath);.
2e100 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
2e110 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
2e120 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69 64  od->xTruncate(id
2e130 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 28  , .           ((
2e140 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
2e150 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2e160 49 53 5f 4d 53 44 4f 53 29 20 21 3d 20 30 29 20  IS_MSDOS) != 0) 
2e170 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a 20 20 20 20  ? 1L : 0L);.    
2e180 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e190 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e1a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2e1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2e1c0 20 66 6f 72 63 65 20 29 7b 0a 20 20 20 20 72 63   force ){.    rc
2e1d0 20 3d 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74   = unixInvalidat
2e1e0 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46  eSupportFiles(pF
2e1f0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ile, 0);.    if(
2e200 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 61 66   rc ){.      saf
2e210 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2e220 20 7d 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e   }.  }.  pFile->
2e230 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69  pMethod->xSync(i
2e240 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  d, SQLITE_SYNC_F
2e250 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69 73  ULL);...  if( is
2e260 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
2e270 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2e280 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  unlock_corrupt(i
2e290 64 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f  d, corruptFileLo
2e2a0 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ck);.  }else if(
2e2b0 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71   pLock ){.    sq
2e2c0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
2e2d0 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
2e2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2e2f0 74 28 66 6f 72 63 65 29 3b 0a 20 20 7d 0a 20 20  t(force);.  }.  
2e300 0a 20 20 69 66 28 20 66 6f 72 63 65 20 26 26 20  .  if( force && 
2e310 73 61 66 65 46 61 69 6c 65 64 29 7b 0a 20 20 20  safeFailed){.   
2e320 20 72 63 20 3d 20 75 6e 69 78 55 6e 73 61 66 65   rc = unixUnsafe
2e330 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2e340 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 0a  (pFile);.  }.  .
2e350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e360 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20 6c 6f 63 61  /*. ** Lock loca
2e370 74 69 6f 6e 73 20 66 6f 72 20 73 68 61 72 65 64  tions for shared
2e380 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 73 20 75 73  -memory locks us
2e390 65 64 20 62 79 20 57 41 4c 20 6d 6f 64 65 2e 0a  ed by WAL mode..
2e3a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 48 4d 5f   */.#ifndef SHM_
2e3b0 42 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53 48  BASE.# define SH
2e3c0 4d 5f 42 41 53 45 20 20 20 20 20 20 20 20 20 20  M_BASE          
2e3d0 31 32 30 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  120.# define SHM
2e3e0 5f 57 52 49 54 45 20 20 20 20 20 20 20 20 20 53  _WRITE         S
2e3f0 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e 65  HM_BASE.# define
2e400 20 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20   SHM_CHECKPOINT 
2e410 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 31 29 0a     (SHM_BASE+1).
2e420 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 43  # define SHM_REC
2e430 4f 56 45 52 20 20 20 20 20 20 20 28 53 48 4d 5f  OVER       (SHM_
2e440 42 41 53 45 2b 32 29 0a 23 20 64 65 66 69 6e 65  BASE+2).# define
2e450 20 53 48 4d 5f 52 45 41 44 5f 46 49 52 53 54 20   SHM_READ_FIRST 
2e460 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 33 29 0a     (SHM_BASE+3).
2e470 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41  # define SHM_REA
2e480 44 5f 53 49 5a 45 20 20 20 20 20 35 0a 23 65 6e  D_SIZE     5.#en
2e490 64 69 66 20 2f 2a 20 53 48 4d 5f 42 41 53 45 20  dif /* SHM_BASE 
2e4a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74  */../*.** This t
2e4b0 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  est only works f
2e4c0 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69 6e 67 20  or lock testing 
2e4d0 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78 20 56 46  on unix/posix VF
2e4e0 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64 20 66 72  S..** Adapted fr
2e4f0 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e  om tool/getlock.
2e500 63 20 66 34 63 33 39 62 36 35 31 33 37 30 31 35  c f4c39b65137015
2e510 36 63 61 65 39 37 39 35 30 31 61 37 62 31 35 36  6cae979501a7b156
2e520 62 64 62 61 35 30 65 37 63 65 0a 2a 2f 0a 73 74  bdba50e7ce.*/.st
2e530 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
2e540 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69  kstatePid(unixFi
2e550 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69 64 5f 74  le *pFile, pid_t
2e560 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b   pid, int *pLock
2e570 73 74 61 74 65 29 7b 0a 20 20 69 6e 74 20 68 44  state){.  int hD
2e580 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  b;        /* Fil
2e590 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2e5a0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2e5b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2e5c0 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20   hShm = -1;  /* 
2e5d0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e5e0 66 6f 72 20 57 41 4c 20 73 68 61 72 65 64 2d 6d  for WAL shared-m
2e5f0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2e600 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20  ssize_t got;    
2e610 2f 2a 20 42 79 74 65 73 20 72 65 61 64 20 66 72  /* Bytes read fr
2e620 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  om header */.  i
2e630 6e 74 20 69 73 57 61 6c 20 3d 20 30 3b 20 20 20  nt isWal = 0;   
2e640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e650 65 20 69 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e if in WAL mode
2e660 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20   */.  int nLock 
2e670 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e680 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
2e690 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
2e6a0 74 20 6e 6f 48 64 72 20 3d 20 30 3b 20 20 20 20  t noHdr = 0;    
2e6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
2e6c0 20 62 79 74 65 20 44 42 20 68 61 73 20 6e 6f 20   byte DB has no 
2e6d0 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 6e 73 69  header */.  unsi
2e6e0 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
2e6f0 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  00];   /* Databa
2e700 73 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a  se header */.  .
2e710 20 20 61 73 73 65 72 74 28 70 4c 6f 63 6b 73 74    assert(pLockst
2e720 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61  ate);.  .  /* ma
2e730 6b 65 20 73 75 72 65 20 77 65 20 61 72 65 20 64  ke sure we are d
2e740 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61  ealing with a da
2e750 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2e760 20 68 44 62 20 3d 20 70 46 69 6c 65 2d 3e 68 3b   hDb = pFile->h;
2e770 0a 20 20 69 66 28 20 68 44 62 3c 30 20 29 7b 0a  .  if( hDb<0 ){.
2e780 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
2e790 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
2e7a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2e7b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2e7c0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2e7d0 20 28 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f   (strlen(SQLITE_
2e7e0 46 49 4c 45 5f 48 45 41 44 45 52 29 2b 31 29 3d  FILE_HEADER)+1)=
2e7f0 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  =SQLITE_FILE_HEA
2e800 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20 67 6f 74  DER_LEN );.  got
2e810 20 3d 20 70 72 65 61 64 28 68 44 62 2c 20 61 48   = pread(hDb, aH
2e820 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69  dr, 100, 0);.  i
2e830 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
2e840 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
2e850 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
2e860 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2e870 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2e880 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 30 20   }.  if( got==0 
2e890 29 7b 0a 20 20 20 20 6e 6f 48 64 72 20 3d 20 31  ){.    noHdr = 1
2e8a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
2e8b0 74 21 3d 31 30 30 0a 20 20 20 20 20 20 20 20 20  t!=100.         
2e8c0 7c 7c 20 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20  || memcmp(aHdr, 
2e8d0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2e8e0 45 52 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ER, SQLITE_FILE_
2e8f0 48 45 41 44 45 52 5f 4c 45 4e 29 21 3d 30 0a 20  HEADER_LEN)!=0. 
2e900 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2e910 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2e920 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  KSTATE_NOTADB;. 
2e930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e940 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a 20 20 0a  _NOTADB;.  }.  .
2e950 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
2e960 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
2e970 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63  e lock */.  nLoc
2e980 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65  k += unixIsLocke
2e990 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 52 44  d(pid, hDb, F_RD
2e9a0 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46 49 52 53  LCK, SHARED_FIRS
2e9b0 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 0a  T, SHARED_SIZE,.
2e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9d0 20 20 20 20 20 20 20 20 22 45 58 43 4c 55 53 49          "EXCLUSI
2e9e0 56 45 22 29 3b 0a 20 20 69 66 20 28 21 6e 6f 48  VE");.  if (!noH
2e9f0 64 72 29 20 7b 0a 20 20 20 20 69 73 57 61 6c 20  dr) {.    isWal 
2ea00 3d 20 61 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20  = aHdr[18]==2;. 
2ea10 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d   }.  if( nLock==
2ea20 30 20 26 26 20 69 73 57 61 6c 3d 3d 30 20 29 7b  0 && isWal==0 ){
2ea30 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  .    /* Rollback
2ea40 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f   mode */.    nLo
2ea50 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b  ck += unixIsLock
2ea60 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 57  ed(pid, hDb, F_W
2ea70 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59  RLCK, PENDING_BY
2ea80 54 45 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2b  TE, SHARED_SIZE+
2ea90 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 45               "PE
2eab0 4e 44 49 4e 47 7c 52 45 53 45 52 56 45 44 7c 53  NDING|RESERVED|S
2eac0 48 41 52 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69  HARED");.  }.  i
2ead0 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69  f( nLock==0 && i
2eae0 73 57 61 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f  sWal!=0 ){.    /
2eaf0 2a 20 6c 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c  * lookup the fil
2eb00 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2eb10 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2eb20 72 79 20 66 69 6c 65 20 69 66 20 77 65 20 68 61  ry file if we ha
2eb30 76 65 20 69 74 20 6f 70 65 6e 0a 20 20 20 20 2a  ve it open.    *
2eb40 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  * in this proces
2eb50 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74  s */.    unixEnt
2eb60 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
2eb70 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
2eb80 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
2eb90 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
2eba0 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20      unixShmNode 
2ebb0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c  *pShmNode = pFil
2ebc0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  e->pInode->pShmN
2ebd0 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ode;.    if( pSh
2ebe0 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  mNode ){.      s
2ebf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2ec00 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2ec10 65 78 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  ex);.      .    
2ec20 20 20 68 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64    hShm = pShmNod
2ec30 65 2d 3e 68 3b 0a 20 20 20 20 20 20 69 66 28 20  e->h;.      if( 
2ec40 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20 20 20 20  hShm >= 0){.    
2ec50 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f      if( unixIsLo
2ec60 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
2ec70 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43  F_RDLCK, SHM_REC
2ec80 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45  OVER, 1, "WAL-RE
2ec90 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20  COVERY") ||.    
2eca0 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63         unixIsLoc
2ecb0 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46  ked(pid, hShm, F
2ecc0 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54  _RDLCK, SHM_WRIT
2ecd0 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45  E, 1, "WAL-WRITE
2ece0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ") ){.          
2ecf0 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nLock = 1;.     
2ed00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ed10 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
2ed20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
2ed30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2ed40 20 20 20 20 7d 20 0a 20 20 20 20 0a 20 20 20 20      } .    .    
2ed50 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20  if( hShm<0 ){.  
2ed60 20 20 20 20 2f 2a 20 74 68 65 20 73 68 61 72 65      /* the share
2ed70 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 73  d memory file is
2ed80 6e 27 74 20 6f 70 65 6e 20 69 6e 20 74 68 69 73  n't open in this
2ed90 20 70 72 6f 63 65 73 73 20 73 70 61 63 65 2c 20   process space, 
2eda0 6f 70 65 6e 20 6f 75 72 0a 20 20 20 20 20 20 2a  open our.      *
2edb0 2a 20 6f 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20  * own FD */.    
2edc0 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50    char zShm[MAXP
2edd0 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a  ATHLEN];.      .
2ede0 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64        /* WAL mod
2edf0 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 6c 63  e */.      strlc
2ee00 70 79 28 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e  py(zShm, pFile->
2ee10 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
2ee20 4e 29 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 61  N);.      strlca
2ee30 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20  t(zShm, "-shm", 
2ee40 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
2ee50 20 20 20 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a     hShm = open(z
2ee60 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  Shm, O_RDONLY, 0
2ee70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68  );.      if( hSh
2ee80 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  m<0 ){.        *
2ee90 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2eea0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46  ITE_LOCKSTATE_OF
2eeb0 46 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c  F;.        unixL
2eec0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
2eed0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2eee0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2eef0 20 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c       if( unixIsL
2ef00 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
2ef10 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45   F_RDLCK, SHM_RE
2ef20 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52  COVER, 1, "WAL-R
2ef30 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20  ECOVERY") ||.   
2ef40 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b        unixIsLock
2ef50 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f  ed(pid, hShm, F_
2ef60 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45  RDLCK, SHM_WRITE
2ef70 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22  , 1, "WAL-WRITE"
2ef80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f  ) ){.        nLo
2ef90 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
2efa0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 53 68 6d        close(hShm
2efb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  );.    }.    uni
2efc0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2efd0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30   }.  if( nLock>0
2efe0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2eff0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2f000 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65  KSTATE_ON;.  } e
2f010 6c 73 65 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  lse {.    *pLock
2f020 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2f030 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20  OCKSTATE_OFF;.  
2f040 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2f050 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2f060 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  /* (SQLITE_ENABL
2f070 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
2f080 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2f090 45 5f 5f 29 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  E__) */..#if SQL
2f0a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2f0b0 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
2f0c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
2f0d0 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
2f0e0 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
2f0f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
2f100 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
2f110 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
2f120 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
2f130 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
2f140 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
2f150 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
2f160 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
2f170 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f180 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
2f190 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
2f1a0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
2f1b0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
2f1c0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
2f1d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2f1e0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
2f1f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
2f200 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
2f210 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
2f220 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2f230 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
2f240 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
2f250 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
2f260 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
2f270 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
2f280 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
2f290 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2f2a0 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
2f2b0 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
2f2c0 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
2f2d0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
2f2e0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
2f2f0 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
2f300 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
2f310 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
2f320 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
2f330 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
2f340 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
2f350 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
2f360 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
2f370 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2f380 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
2f390 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
2f3a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
2f3b0 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
2f3c0 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
2f3d0 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
2f3e0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
2f3f0 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
2f400 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
2f410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2f420 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2f430 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
2f440 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
2f450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f460 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
2f470 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
2f480 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
2f490 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
2f4a0 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f4c0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2f4d0 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
2f4e0 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
2f4f0 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
2f500 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
2f510 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2f520 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
2f530 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
2f540 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f550 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
2f560 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
2f570 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
2f580 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5a0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
2f5b0 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
2f5c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
2f5d0 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
2f5e0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2f5f0 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
2f600 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
2f610 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
2f620 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f630 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
2f640 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
2f650 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
2f660 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
2f670 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
2f680 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
2f690 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
2f6a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
2f6b0 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
2f6c0 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
2f6d0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
2f6e0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
2f6f0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
2f700 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
2f710 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66  if( pOrig ){.#if
2f720 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
2f730 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46   i64 nReuse = pF
2f740 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c  d->mmapSize;.#el
2f750 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
2f760 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47   szSyspage = osG
2f770 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20  etpagesize();.  
2f780 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28    i64 nReuse = (
2f790 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20  pFd->mmapSize & 
2f7a0 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b  ~(szSyspage-1));
2f7b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
2f7c0 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52  pReq = &pOrig[nR
2f7d0 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55  euse];..    /* U
2f7e0 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f  nmap any pages o
2f7f0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  f the existing m
2f800 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e  apping that cann
2f810 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f  ot be reused. */
2f820 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21  .    if( nReuse!
2f830 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  =nOrig ){.      
2f840 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e  osMunmap(pReq, n
2f850 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20  Orig-nReuse);.  
2f860 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52    }..#if HAVE_MR
2f870 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20  EMAP.    pNew = 
2f880 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20  osMremap(pOrig, 
2f890 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52  nReuse, nNew, MR
2f8a0 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20  EMAP_MAYMOVE);. 
2f8b0 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61     zErr = "mrema
2f8c0 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p";.#else.    pN
2f8d0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71  ew = osMmap(pReq
2f8e0 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66  , nNew-nReuse, f
2f8f0 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
2f900 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  , h, nReuse);.  
2f910 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f    if( pNew!=MAP_
2f920 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2f930 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29  if( pNew!=pReq )
2f940 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
2f950 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20  ap(pNew, nNew - 
2f960 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20  nReuse);.       
2f970 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20   pNew = 0;.     
2f980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f990 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20  pNew = pOrig;.  
2f9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2f9b0 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  if..    /* The a
2f9c0 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64  ttempt to extend
2f9d0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
2f9e0 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72  pping failed. Fr
2f9f0 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ee it. */.    if
2fa00 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
2fa10 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b  ED || pNew==0 ){
2fa20 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2fa30 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a  pOrig, nReuse);.
2fa40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2fa50 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c  If pNew is still
2fa60 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72   NULL, try to cr
2fa70 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79  eate an entirely
2fa80 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
2fa90 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2faa0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  {.    pNew = osM
2fab0 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61  map(0, nNew, fla
2fac0 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
2fad0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  h, 0);.  }..  if
2fae0 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
2faf0 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ED ){.    pNew =
2fb00 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30   0;.    nNew = 0
2fb10 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  ;.    unixLogErr
2fb20 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45  or(SQLITE_OK, zE
2fb30 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  rr, pFd->zPath);
2fb40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2fb50 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69  mmap() above fai
2fb60 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  led, assume that
2fb70 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
2fb80 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20  mmap() calls.   
2fb90 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c   ** will probabl
2fba0 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c  y fail too. Fall
2fbb0 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78   back to using x
2fbc0 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c  Read/xWrite excl
2fbd0 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69  usively.    ** i
2fbe0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
2fbf0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
2fc00 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  zeMax = 0;.  }. 
2fc10 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
2fc20 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b   = (void *)pNew;
2fc30 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  .  pFd->mmapSize
2fc40 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
2fc50 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d  Actual = nNew;.}
2fc60 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
2fc70 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
2fc80 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
2fc90 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
2fca0 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
2fcb0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
2fcc0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
2fcd0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
2fce0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
2fcf0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
2fd00 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
2fd10 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
2fd20 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
2fd30 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
2fd40 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
2fd50 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
2fd60 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
2fd70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2fd80 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
2fd90 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
2fda0 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
2fdb0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
2fdc0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
2fdd0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
2fde0 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
2fdf0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
2fe00 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
2fe10 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
2fe20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
2fe30 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
2fe40 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
2fe50 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
2fe60 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
2fe70 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
2fe80 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
2fe90 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
2fea0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
2feb0 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
2fec0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
2fed0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
2fee0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
2fef0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2ff00 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
2ff10 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
2ff20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
2ff30 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
2ff40 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
2ff50 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2ff60 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
2ff70 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
2ff80 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
2ff90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
2ffa0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
2ffb0 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
2ffc0 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e  {.  i64 nMap = n
2ffd0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
2ffe0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
2fff0 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
30000 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
30010 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
30020 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30030 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
30040 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  p<0 ){.    struc
30050 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
30060 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
30070 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
30080 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63  mation */.    rc
30090 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e   = osFstat(pFd->
300a0 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  h, &statbuf);.  
300b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
300c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
300d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
300e0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
300f0 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
30100 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
30110 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
30120 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
30130 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
30140 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
30150 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
30160 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
30170 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20  if( nMap>0 ){.  
30180 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
30190 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
301a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
301b0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
301c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
301d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
301e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
301f0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
30200 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
30210 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
30220 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
30230 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
30240 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
30250 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
30260 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
30270 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
30280 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
30290 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
302a0 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
302b0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
302c0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
302d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
302e0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
302f0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
30300 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
30310 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
30320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
30330 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
30340 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
30350 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
30360 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
30370 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
30380 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
30390 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
303a0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
303b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
303c0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
303d0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
303e0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
303f0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
30400 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
30410 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
30420 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
30430 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
30440 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30450 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
30460 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
30470 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30480 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
30490 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
304a0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
304b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
304c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
304d0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
304e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
304f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
30500 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
30510 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
30520 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
30530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
30540 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
30550 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
30560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30570 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
30580 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30590 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
305a0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
305b0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
305c0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
305d0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
305e0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
305f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
30600 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30610 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
30620 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
30630 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
30640 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
30650 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
30660 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
30670 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
30680 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
30690 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
306a0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
306b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
306c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
306d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
306e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
306f0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
30700 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
30710 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
30720 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
30730 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
30740 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
30750 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
30760 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
30770 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
30780 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
30790 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
307a0 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
307b0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
307c0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
307d0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
307e0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
307f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30800 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
30810 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30820 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
30830 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
30840 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
30850 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
30860 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
30870 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
30880 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
30890 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
308a0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
308b0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
308c0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
308d0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
308e0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
308f0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
30900 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
30910 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
30920 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
30930 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
30940 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
30950 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
30960 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
30970 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
30980 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
30990 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
309a0 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
309b0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
309c0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
309d0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
309e0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
309f0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
30a00 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
30a10 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
30a20 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
30a30 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
30a40 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
30a50 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
30a60 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
30a70 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
30a80 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
30a90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
30aa0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30ab0 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
30ac0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30ad0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
30ae0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
30af0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
30b00 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
30b10 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
30b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b30 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
30b40 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
30b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
30b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
30bc0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
30bd0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
30be0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
30bf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
30c00 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
30c10 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
30c20 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
30c30 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
30c40 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
30c50 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
30c60 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
30c70 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
30c80 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
30c90 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
30ca0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
30cb0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
30cc0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
30cd0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
30ce0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
30cf0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
30d00 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
30d10 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
30d20 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
30d30 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
30d40 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
30d50 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
30d60 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
30d70 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
30d80 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
30d90 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
30da0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
30db0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
30dc0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
30dd0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
30de0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
30df0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
30e00 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
30e10 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
30e20 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
30e30 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
30e40 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
30e50 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
30e60 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
30e70 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
30e80 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
30e90 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
30ea0 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
30eb0 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
30ec0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
30ed0 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
30ee0 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
30ef0 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
30f00 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
30f10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
30f20 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
30f30 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
30f40 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
30f50 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
30f60 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
30f70 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
30f80 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
30f90 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
30fa0 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
30fb0 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
30fc0 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
30fd0 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
30fe0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
30ff0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
31000 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
31010 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
31020 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
31030 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
31040 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
31050 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31060 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
31070 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
31080 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
31090 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
310a0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
310b0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
310c0 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
310d0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
310e0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
310f0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
31100 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
31110 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
31120 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
31130 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
31140 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
31150 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
31160 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
31170 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
31180 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
31190 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
311a0 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
311b0 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
311e0 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
311f0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
31200 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
31210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31220 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
31230 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
31240 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
31250 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31270 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
31280 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
31290 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
312a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
312d0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
312e0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
312f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31310 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
31320 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
31330 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
31340 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
31370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31380 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
31390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313b0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
313c0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
313d0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
313e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31450 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31470 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
31480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
314a0 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
314d0 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
314f0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
31500 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
31510 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
31520 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31530 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31540 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
31550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
31560 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31590 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
315a0 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
315b0 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
315c0 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
315d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
315e0 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
315f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31600 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31630 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
31640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31650 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31680 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
31690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
316a0 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
316d0 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  xShmUnmap,      
316e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
316f0 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31710 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31720 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
31730 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
31740 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55        \.   unixU
31770 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nfetch,         
31780 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
31790 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31800 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
31810 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
31820 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
31830 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
31840 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
31850 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
31860 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
31870 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
31880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318a0 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
318b0 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318f0 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31940 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
31950 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31960 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
31970 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
31980 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
31990 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
319a0 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
319b0 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
319c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
319d0 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
319e0 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
319f0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
31a00 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
31a10 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
31a20 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
31a30 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
31a40 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
31a50 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
31a60 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
31a70 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
31a80 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
31a90 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
31aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
31ab0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
31ac0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
31ad0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
31ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
31af0 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d  red memory and m
31b00 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20  map are enabled 
31b10 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
31b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31b30 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
31b40 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31b60 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
31b70 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b90 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
31ba0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
31bb0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
31bc0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
31bd0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
31be0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
31bf0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
31c00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
31c10 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
31c20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
31c30 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
31c40 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
31c50 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
31c60 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
31c90 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
31ca0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
31cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
31cc0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
31cd0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
31ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
31cf0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
31d00 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
31d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
31d20 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
31d30 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
31d40 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
31d50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
31d60 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
31d70 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
31d80 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
31d90 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
31da0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
31db0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
31dc0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
31dd0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
31de0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
31df0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
31e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
31e10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
31e20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
31e30 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
31e40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
31e50 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
31e60 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
31e70 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
31e80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
31e90 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
31ea0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
31eb0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
31ec0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
31ed0 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
31ee0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
31ef0 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
31f00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
31f10 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
31f20 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
31f30 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
31f40 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
31f50 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
31f60 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
31f70 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
31f80 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
31f90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
31fa0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
31fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
31fd0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
31fe0 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
31ff0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
32000 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32010 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
32020 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
32030 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32040 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
32050 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
32060 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
32070 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
32080 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32090 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
320a0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
320b0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
320c0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
320d0 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
320e0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
320f0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
32100 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
32110 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
32120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
32130 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
32140 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
32150 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32170 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
32180 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
32190 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
321a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
321b0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
321c0 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
321d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
321e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
321f0 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
32200 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
32210 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
32220 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
32230 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
32240 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
32250 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
32260 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
32270 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
32280 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32290 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
322a0 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
322b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
322c0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
322d0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
322e0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
322f0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32300 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32310 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
32320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32330 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32340 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
32350 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
32360 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
32370 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
32380 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
32390 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
323a0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
323b0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
323c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
323d0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
323e0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
323f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
32400 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
32410 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
32420 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
32430 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
32440 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
32450 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
32460 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
32470 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
32480 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
32490 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
324a0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
324b0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
324c0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
324d0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
324e0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
324f0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
32500 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
32510 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
32520 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
32530 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
32540 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
32550 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
32560 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
32570 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
32580 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
32590 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
325a0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
325b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
325c0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
325d0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
325e0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
325f0 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
32600 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
32610 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
32620 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
32630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
32640 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
32650 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
32660 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
32670 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
32680 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
32690 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
326a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
326b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
326c0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
326d0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
326e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
326f0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
32700 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
32710 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
32720 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
32730 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
32740 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
32750 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
32760 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
32770 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
32780 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327a0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
327b0 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
327c0 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
327d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
327e0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
327f0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
32800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32810 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32820 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
32830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
32840 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
32850 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
32860 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
32870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32880 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
32890 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
328a0 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
328b0 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
328c0 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
328d0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
328e0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
328f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
32900 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32910 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
32920 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
32930 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
32940 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
32950 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
32960 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
32970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
32980 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
32990 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
329a0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
329b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
329c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
329d0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
329e0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
329f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
32a00 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
32a10 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
32a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
32a30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
32a40 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
32a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
32a60 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
32a70 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
32a80 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
32a90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32aa0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
32ab0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
32ac0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
32ad0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
32ae0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
32af0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
32b00 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
32b10 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
32b20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
32b30 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
32b40 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
32b50 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
32b60 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
32b70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
32b80 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
32b90 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
32ba0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
32bb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
32bc0 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
32bd0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
32be0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32bf0 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
32c00 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
32c10 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
32c20 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
32c30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32c40 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
32c50 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
32c60 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
32c70 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
32c80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
32c90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
32ca0 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
32cb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
32cc0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
32cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
32ce0 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
32cf0 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
32d00 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
32d10 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
32d20 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
32d30 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
32d40 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
32d50 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
32d60 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
32d70 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
32d80 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
32d90 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
32da0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
32db0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
32dc0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
32dd0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
32de0 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
32df0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
32e00 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
32e10 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
32e20 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
32e30 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
32e40 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
32e50 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
32e60 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
32e70 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
32e80 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
32e90 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
32ea0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
32eb0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
32ec0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
32ed0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
32ee0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
32ef0 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
32f00 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
32f10 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
32f20 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
32f30 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
32f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
32f50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
32f60 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
32f70 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
32f80 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
32f90 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
32fa0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
32fb0 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
32fc0 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
32fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
32fe0 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
32ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33000 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
33010 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
33020 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
33030 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
33040 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
33050 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
33060 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
33070 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
33080 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
33090 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
330a0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
330b0 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
330c0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
330d0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
330e0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
330f0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
33100 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
33110 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
33120 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
33130 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
33140 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
33150 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
33160 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
33170 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
33180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
33190 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
331a0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
331b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
331c0 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
331d0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
331e0 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
331f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
33200 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
33210 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
33220 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
33230 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
33240 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
33250 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
33260 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
33270 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
33280 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
33290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
332a0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
332b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
332c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
332d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
332e0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
332f0 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
33300 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
33310 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
33320 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
33330 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
33340 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
33350 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
33360 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
33370 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
33380 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
33390 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
333a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
333b0 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
333c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
333d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
333e0 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
333f0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
33400 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
33410 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
33420 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
33430 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
33440 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
33450 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
33460 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
33470 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
33480 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
33490 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
334a0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
334b0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
334c0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
334d0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
334e0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
334f0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
33500 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
33510 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
33520 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
33530 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
33540 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
33550 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
33560 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
33570 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
33580 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
33590 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
335a0 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
335b0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
335c0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
335d0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
335e0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
335f0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
33600 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
33610 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
33620 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
33630 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
33640 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
33650 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
33660 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
33670 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
33680 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
33690 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
336a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
336b0 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
336c0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
336d0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
336e0 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
336f0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
33700 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
33710 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
33720 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
33730 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
33740 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
33750 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
33760 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
33770 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
33780 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
33790 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
337a0 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
337b0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
337c0 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
337d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33810 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
33820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33830 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
33840 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
33850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33860 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
33870 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
33880 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
33890 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
338a0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
338b0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
338c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
338d0 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
338e0 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
338f0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
33900 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
33910 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
33920 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
33930 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
33940 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33950 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
33960 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
33970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
33980 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
33990 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
339a0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
339b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
339c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
339d0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
339e0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
339f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
33a00 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
33a10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
33a20 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
33a30 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20  int ctrlFlags   
33a40 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
33a50 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45  or more UNIXFILE
33a60 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  _* values */.){.
33a70 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
33a80 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63  io_methods *pLoc
33a90 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
33aa0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
33ab0 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
33ac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33ad0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
33ae0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55  pNew->pInode==NU
33af0 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61  LL );..  /* Usua
33b00 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69  lly the path zFi
33b10 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f  lename should no
33b20 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20  t be a relative 
33b30 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20  pathname. The.  
33b40 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  ** exception is 
33b50 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
33b60 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66   proxy "conch" f
33b70 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68  ile in builds th
33b80 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20  at.  ** include 
33b90 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c  the special Appl
33ba0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73  e locking styles
33bb0 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
33bc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
33bd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33be0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61  OCKING_STYLE.  a
33bf0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
33c00 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
33c10 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c  [0]=='/' .    ||
33c20 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d   pVfs->pAppData=
33c30 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63  =(void*)&autoloc
33c40 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c  kIoFinder );.#el
33c50 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  se.  assert( zFi
33c60 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
33c70 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  lename[0]=='/' )
33c80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e  ;.#endif..  /* N
33c90 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73  o locking occurs
33ca0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69   in temporary fi
33cb0 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
33cc0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c   zFilename!=0 ||
33cd0 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e   (ctrlFlags & UN
33ce0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d  IXFILE_NOLOCK)!=
33cf0 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
33d00 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
33d10 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
33d20 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  me));.  pNew->h 
33d30 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66  = h;.  pNew->pVf
33d40 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77  s = pVfs;.  pNew
33d50 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
33d60 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72  ame;.  pNew->ctr
33d70 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72  lFlags = (u8)ctr
33d80 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49  lFlags;.#if SQLI
33d90 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
33da0 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53  >0.  pNew->mmapS
33db0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
33dc0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
33dd0 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  map;.#endif.  if
33de0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
33df0 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67  olean(((ctrlFlag
33e00 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  s & UNIXFILE_URI
33e10 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20  ) ? zFilename : 
33e20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
33e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33e40 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
33e50 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
33e60 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  E) ){.    pNew->
33e70 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
33e80 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  XFILE_PSOW;.  }.
33e90 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66    if( strcmp(pVf
33ea0 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
33eb0 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  xcl")==0 ){.    
33ec0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
33ed0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  |= UNIXFILE_EXCL
33ee0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
33ef0 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49  WORKS.  pNew->pI
33f00 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46  d = vxworksFindF
33f10 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29  ileId(zFilename)
33f20 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49  ;.  if( pNew->pI
33f30 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c  d==0 ){.    ctrl
33f40 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
33f50 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  E_NOLOCK;.    rc
33f60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33f70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
33f80 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
33f90 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
33fa0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
33fb0 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
33fc0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
33fd0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
33fe0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
33ff0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
34000 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
34010 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
34020 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34030 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
34040 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
34050 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
34060 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
34070 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
34080 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
34090 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
340a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
340b0 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
340c0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
340d0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
340e0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
340f0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
34100 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
34110 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
34120 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
34130 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
34140 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
34150 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
34160 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
34170 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
34180 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
34190 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
341a0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
341b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
341c0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
341d0 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20 73 75  endif.     /* su
341e0 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65 20 6f  pport WAL mode o
341f0 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f 75 6e  n read only moun
34200 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 20 2a  ted filesystem *
34210 2f 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  /.    || pLockin
34220 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63  gStyle == &noloc
34230 6b 49 6f 4d 65 74 68 6f 64 73 20 0a 20 20 29 7b  kIoMethods .  ){
34240 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
34250 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
34260 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
34270 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
34280 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
34290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
342a0 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
342b0 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69  r occurred in fi
342c0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
342d0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
342e0 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
342f0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
34300 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
34310 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
34320 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
34330 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
34340 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
34350 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34360 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
34370 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
34380 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
34390 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
343a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
343b0 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
343c0 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
343d0 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
343e0 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
343f0 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
34400 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
34410 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
34420 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
34430 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
34440 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
34450 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
34460 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
34470 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
34480 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
34490 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
344a0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
344b0 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
344c0 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
344d0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
344e0 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
344f0 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
34500 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
34510 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
34520 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
34530 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34540 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
34550 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
34560 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
34570 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
34580 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
34590 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
345a0 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
345b0 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
345c0 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
345d0 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
345e0 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
345f0 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
34600 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
34610 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
34620 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
34630 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
34640 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
34650 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
34660 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
34670 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
34680 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
34690 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
346a0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
346b0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
346c0 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
346d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
346e0 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
346f0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
34700 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
34710 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
34720 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
34730 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
34740 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
34750 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
34760 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
34770 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
34780 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
34790 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
347a0 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
347b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
347c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
347d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
347e0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
347f0 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
34800 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
34810 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
34820 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
34830 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
34840 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
34850 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
34860 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
34870 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
34880 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
34890 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
348a0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
348b0 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
348c0 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
348d0 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
348e0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
348f0 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
34900 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
34910 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
34920 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34940 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34950 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
34960 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
34970 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
34980 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
34990 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
349a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
349b0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
349c0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
349d0 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
349e0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
349f0 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
34a00 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
34a10 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
34a20 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
34a30 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
34a40 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
34a50 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
34a60 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
34a70 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
34a80 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
34a90 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
34aa0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
34ab0 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
34ac0 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
34ad0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
34ae0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
34af0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
34b00 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
34b10 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
34b20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
34b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
34b40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34b60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34b70 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
34b80 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
34b90 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
34ba0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
34bb0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
34bc0 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
34bd0 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
34be0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
34bf0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
34c00 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
34c10 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
34c20 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
34c30 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
34c40 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
34c50 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
34c60 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
34c70 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
34c80 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
34c90 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
34ca0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
34cb0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
34cc0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
34cd0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
34ce0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
34cf0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
34d00 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
34d10 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
34d20 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
34d30 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
34d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
34d50 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
34d60 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
34d70 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d90 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
34da0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
34db0 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
34dc0 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
34dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
34de0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
34df0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
34e00 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
34e10 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
34e20 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
34e30 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
34e40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
34e50 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
34e60 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
34e70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
34e80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34e90 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
34ea0 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
34eb0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
34ec0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
34ed0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
34ee0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
34ef0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
34f00 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
34f10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34f20 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
34f30 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
34f40 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
34f50 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
34f60 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
34f70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Filename);.    p
34f80 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
34f90 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
34fa0 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  E;.  }.#endif.  
34fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34fc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
34fd0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
34fe0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
34ff0 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  __);.  }else{.  
35000 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
35010 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
35020 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
35030 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79  (+1);.    verify
35040 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20  DbFile(pNew);.  
35050 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35060 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
35070 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  he name of a dir
35080 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20  ectory in which 
35090 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79  to put temporary
350a0 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f   files..** If no
350b0 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72   suitable tempor
350c0 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f  ary file directo
350d0 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ry can be found,
350e0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
350f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
35100 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
35110 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
35120 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
35130 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
35140 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
35150 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
35160 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
35170 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
35180 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20  p",.     0      
35190 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
351a0 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75  ator */.  };.  u
351b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
351c0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
351d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
351e0 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44  zDir = 0;..  azD
351f0 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
35200 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
35210 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
35220 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
35230 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
35240 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21  MPDIR");.  if( !
35250 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
35260 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
35270 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28  TMPDIR");.  for(
35280 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
35290 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
352a0 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
352b0 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
352c0 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f  if( zDir==0 ) co
352d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
352e0 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75  osStat(zDir, &bu
352f0 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
35300 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
35310 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
35320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
35330 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20   osAccess(zDir, 
35340 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  07) ) continue;.
35350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
35360 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a   return zDir;.}.
35370 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
35380 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
35390 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
353a0 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  uf must be alloc
353b0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
353c0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61  alling process a
353d0 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  nd must be big e
353e0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74  nough to hold at
353f0 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e   least.** pVfs->
35400 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
35410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35420 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
35430 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
35440 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
35450 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
35460 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
35470 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
35480 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
35490 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
354a0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
354b0 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
354c0 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ";.  unsigned in
354d0 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20  t i, j;.  const 
354e0 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f  char *zDir;..  /
354f0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
35500 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
35510 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
35520 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
35530 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
35540 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
35550 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
35560 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
35570 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
35580 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
35590 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
355a0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
355b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
355c0 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65  .  zDir = unixTe
355d0 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69  mpFileDir();.  i
355e0 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69  f( zDir==0 ) zDi
355f0 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43  r = ".";..  /* C
35600 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
35610 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
35620 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
35630 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
35640 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
35650 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
35660 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74  ..  */.  if( (st
35680 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72  rlen(zDir) + str
35690 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  len(SQLITE_TEMP_
356a0 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31  FILE_PREFIX) + 1
356b0 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42  8) >= (size_t)nB
356c0 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  uf ){.    return
356d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
356e0 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71   }..  do{.    sq
356f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
35700 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25  Buf-18, zBuf, "%
35710 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  s/"SQLITE_TEMP_F
35720 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72  ILE_PREFIX, zDir
35730 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29  );.    j = (int)
35740 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
35750 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
35760 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
35770 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
35780 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
35790 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20  {.      zBuf[j] 
357a0 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
357b0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
357c0 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
357d0 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
357e0 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d     }.    zBuf[j]
357f0 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a   = 0;.    zBuf[j
35800 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  +1] = 0;.  }whil
35810 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66  e( osAccess(zBuf
35820 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
35830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35840 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
35850 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
35860 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
35870 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
35880 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
35890 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
358a0 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
358b0 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
358c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
358d0 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
358e0 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
358f0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
35900 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
35910 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
35920 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
35930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35940 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
35950 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
35960 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
35970 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
35980 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
35990 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
359a0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
359b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
359c0 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
359d0 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
359e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
359f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
35a00 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
35a10 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
35a20 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
35a30 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
35a40 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
35a50 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
35a60 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
35a70 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
35a80 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
35a90 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
35aa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
35ab0 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
35ac0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
35ad0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
35ae0 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
35af0 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
35b00 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
35b10 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
35b20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
35b30 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
35b40 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
35b50 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
35b60 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
35b70 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
35b80 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
35b90 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
35ba0 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
35bb0 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
35bc0 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
35bd0 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
35be0 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
35bf0 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
35c00 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
35c10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35c20 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
35c30 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
35c40 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
35c50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
35c60 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
35c70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
35c80 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
35c90 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
35ca0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
35cb0 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
35cc0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
35cd0 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
35ce0 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
35cf0 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
35d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
35d10 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
35d20 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
35d30 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
35d40 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
35d50 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
35d60 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
35d70 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
35d80 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
35d90 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
35da0 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
35db0 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
35dc0 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
35dd0 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
35de0 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
35df0 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
35e00 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
35e10 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
35e20 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
35e30 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
35e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35e50 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
35e60 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f  t() call */..  /
35e70 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
35e80 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
35e90 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
35ea0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
35eb0 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
35ec0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
35ed0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
35ee0 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
35ef0 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
35f00 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
35f10 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
35f20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
35f30 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
35f40 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
35f50 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
35f60 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
35f70 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
35f80 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
35f90 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
35fa0 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
35fb0 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
35fc0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
35fd0 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
35fe0 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
35ff0 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
36000 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
36010 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
36020 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
36030 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73  hing for a resus
36040 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
36050 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
36060 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
36070 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73  osStat(zPath, &s
36080 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69  Stat) ){.    uni
36090 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
360a0 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74  de;..    unixEnt
360b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70  erMutex();.    p
360c0 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
360d0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49  t;.    while( pI
360e0 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d  node && (pInode-
360f0 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74  >fileId.dev!=sSt
36100 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20  at.st_dev.      
36110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
36120 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  | pInode->fileId
36130 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69  .ino!=sStat.st_i
36140 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49  no) ){.       pI
36150 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
36160 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
36170 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
36180 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
36190 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
361a0 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e  (pp=&pInode->pUn
361b0 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
361c0 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
361d0 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
361e0 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
361f0 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
36200 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
36210 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
36220 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20  Unused->pNext;. 
36230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
36240 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
36250 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20  );.  }.#endif   
36260 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
36270 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
36280 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
36290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
362a0 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78  s called by unix
362b0 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d  Open() to determ
362c0 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72  ine the unix per
362d0 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63  missions.** to c
362e0 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20  reate new files 
362f0 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f  with. If no erro
36300 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
36310 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
36320 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61  rned.** and a va
36330 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  lue suitable for
36340 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20   passing as the 
36350 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
36360 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20  o open(2) is.** 
36370 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64  written to *pMod
36380 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  e. If an IO erro
36390 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
363a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
363b0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  s .** returned a
363c0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
363d0 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f  *pMode is not mo
363e0 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  dified..**.** In
363f0 20 6d 6f 73 74 20 63 61 73 65 73 20 63 61 73 65   most cases case
36400 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
36410 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30  sets *pMode to 0
36420 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63  , which will bec
36430 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61  ome.** an indica
36440 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f  tion to robust_o
36450 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20  pen() to create 
36460 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a  the file using.*
36470 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
36480 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
36490 53 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68  S adjusted by th
364a0 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20  e umask..** But 
364b0 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
364c0 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
364d0 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
364e0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
364f0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
36500 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
36510 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
36520 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
36530 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
36540 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
36550 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
36560 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
36570 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
36580 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
36590 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
365a0 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
365b0 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
365c0 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
365d0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
365e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
365f0 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
36600 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
36610 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  S option is enab
36620 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
36630 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
36640 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
36650 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45  e.  But 8_3_NAME
36660 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  S is only used f
36670 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79  or.** FAT filesy
36680 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73  stems and permis
36690 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74  sions do not mat
366a0 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75  ter there, so ju
366b0 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65  st use.** the de
366c0 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
366d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
366e0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
366f0 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
36700 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
36710 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
36720 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
36730 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
36740 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
36770 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
36780 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
36790 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
367a0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
367b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
367c0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
367d0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
367e0 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36800 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73  /* OUT: uid to s
36810 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
36820 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
36830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36840 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
36850 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
36860 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
36870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
36880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36890 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a  turn Code */.  *
368a0 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55  pMode = 0;.  *pU
368b0 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20  id = 0;.  *pGid 
368c0 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  = 0;.  if( flags
368d0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
368e0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
368f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
36900 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
36910 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
36920 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
36930 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
36940 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
36950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36960 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
36970 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
36980 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
36990 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
369a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
369b0 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
369c0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
369d0 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
369e0 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
369f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
36a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
36a10 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
36a20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
36a30 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
36a40 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
36a50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
36a60 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
36a70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
36a80 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
36a90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
36aa0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
36ab0 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
36ac0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
36ad0 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
36ae0 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
36af0 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22  alNN".    **   "
36b00 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
36b10 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
36b20 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20  * where NN is a 
36b30 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
36b40 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
36b50 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
36b60 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
36b70 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
36b80 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
36b90 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
36ba0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
36bb0 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49   1; .#ifdef SQLI
36bc0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
36bd0 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  MES.    while( n
36be0 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49  Db>0 && sqlite3I
36bf0 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62  salnum(zPath[nDb
36c00 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20  ]) ) nDb--;.    
36c10 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50  if( nDb==0 || zP
36c20 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20  ath[nDb]!='-' ) 
36c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36c40 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c  ;.#else.    whil
36c50 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  e( zPath[nDb]!='
36c60 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  -' ){.      asse
36c70 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20  rt( nDb>0 );.   
36c80 20 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68     assert( zPath
36c90 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20  [nDb]!='\n' );. 
36ca0 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20       nDb--;.    
36cb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d  }.#endif.    mem
36cc0 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20  cpy(zDb, zPath, 
36cd0 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44  nDb);.    zDb[nD
36ce0 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  b] = '\0';..    
36cf0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44  if( 0==osStat(zD
36d00 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  b, &sStat) ){.  
36d10 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74      *pMode = sSt
36d20 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37  at.st_mode & 077
36d30 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d  7;.      *pUid =
36d40 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20   sStat.st_uid;. 
36d50 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74       *pGid = sSt
36d60 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d  at.st_gid;.    }
36d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
36d80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
36d90 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  TAT;.    }.  }el
36da0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
36db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
36dc0 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
36dd0 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
36de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36df0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
36e00 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
36e10 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
36e20 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
36e30 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
36e40 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
36e50 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
36e60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
36e70 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
36e80 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
36e90 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
36ea0 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
36eb0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
36ec0 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
36ed0 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
36ee0 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
36ef0 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
36f00 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
36f10 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
36f20 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
36f30 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
36f40 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
36f50 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
36f60 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
36f70 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
36f80 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
36f90 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
36fa0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
36fb0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
36fc0 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
36fd0 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
36fe0 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
36ff0 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
37000 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
37010 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
37020 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
37030 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
37040 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
37050 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
37060 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
37070 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
37080 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
37090 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
370a0 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
370b0 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
370c0 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
370d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
370e0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
370f0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
37100 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
37110 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
37120 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
37130 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
37140 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
37150 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
37160 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
37170 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
37180 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
37190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
371a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
371b0 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
371c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
371d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371e0 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
371f0 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
37200 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
37210 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
37220 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
37230 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
37240 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
37250 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
37260 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
37270 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
37280 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
37290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
372a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
372b0 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
372c0 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
372d0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
372e0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
372f0 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
37300 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
37310 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
37320 49 4f 4e 0a 20 20 69 6e 74 20 65 54 79 70 65 20  ION.  int eType 
37330 3d 20 66 6c 61 67 73 26 30 78 46 46 30 46 46 46  = flags&0xFF0FFF
37340 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
37350 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
37360 23 65 6c 73 65 0a 20 20 69 6e 74 20 65 54 79 70  #else.  int eTyp
37370 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
37380 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
37390 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
373a0 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
373b0 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
373c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
373d0 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
373e0 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
373f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37400 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
37410 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
37420 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
37430 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37450 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
37460 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
37470 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
37480 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
37490 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
374a0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
374b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
374c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
374d0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
374e0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
374f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
37500 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
37510 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
37520 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37530 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
37540 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
37550 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
37560 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
37570 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
37580 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
37590 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
375a0 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
375b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
375c0 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
375d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
375e0 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
375f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
37600 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
37610 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
37620 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
37630 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
37640 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
37650 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
37660 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
37670 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
37680 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
37690 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
376a0 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
376b0 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
376c0 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
376d0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
376e0 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
376f0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
37700 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ..  */.  int syn
37710 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65  cDir = (isCreate
37720 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
37730 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
37740 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
37750 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
37760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
37770 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
37780 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
37790 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
377a0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
377b0 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
377c0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
377d0 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
377e0 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
377f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
37800 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
37810 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
37820 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
37830 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
37840 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
37850 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  2];.  const char
37860 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
37870 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
37880 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
37890 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
378a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
378b0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
378c0 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
378d0 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
378e0 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
378f0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
37900 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
37910 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
37920 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
37930 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
37940 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
37950 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
37960 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
37970 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
37980 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
37990 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
379a0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
379b0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
379c0 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
379d0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
379e0 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
379f0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
37a00 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
37a10 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
37a20 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
37a30 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
37a40 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
37a50 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
37a60 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
37a70 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
37a80 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
37a90 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
37aa0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
37ab0 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
37ac0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
37ad0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
37ae0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
37af0 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
37b00 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
37b10 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
37b20 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
37b30 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
37b40 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
37b50 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
37b60 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
37b70 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
37b80 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
37b90 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
37ba0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
37bb0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
37bc0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
37bd0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
37be0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
37bf0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
37c00 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
37c10 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
37c20 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
37c30 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
37c40 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
37c50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
37c60 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37c70 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
37c80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
37c90 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
37ca0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
37cb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
37cc0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
37cd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
37ce0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
37cf0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
37d00 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
37d10 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
37d20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
37d30 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
37d40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
37d50 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
37d60 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
37d70 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
37d80 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20  );..  /* Detect 
37d90 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64  a pid change and
37da0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
37db0 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63    There is a rac
37dc0 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a  e condition.  **
37dd0 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20   here such that 
37de0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65  two or more thre
37df0 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74  ads all trying t
37e00 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73  o open databases
37e10 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d   at.  ** the sam
37e20 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20  e instant might 
37e30 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52  all reset the PR
37e40 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c  NG.  But multipl
37e50 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72  e resets.  ** ar
37e60 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  e harmless..  */
37e70 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73  .  if( randomnes
37e80 73 50 69 64 21 3d 67 65 74 70 69 64 28 29 20 29  sPid!=getpid() )
37e90 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73  {.    randomness
37ea0 50 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  Pid = getpid();.
37eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
37ec0 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
37ed0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
37ee0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
37ef0 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
37f00 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
37f10 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
37f20 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
37f30 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
37f40 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
37f50 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
37f60 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
37f70 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
37f80 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
37f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
37fa0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
37fb0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
37fc0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
37fd0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
37fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37ff0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
38000 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
38010 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
38020 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
38030 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
38040 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
38050 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
38060 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
38070 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
38080 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
38090 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
380a0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
380b0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
380c0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
380d0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
380e0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
380f0 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
38100 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
38110 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
38120 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
38130 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
38140 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
38150 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
38160 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
38170 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
38180 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
38190 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
381a0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
381b0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a  AX_PATHNAME+2, z
381c0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
381d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
381e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
381f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
38200 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
38210 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
38220 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
38230 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73  names are always
38240 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
38250 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66  minated.    ** f
38260 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65  or use by sqlite
38270 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
38280 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
38290 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  ( zName[strlen(z
382a0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20  Name)+1]==0 );. 
382b0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
382c0 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
382d0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
382e0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
382f0 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
38300 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
38310 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
38320 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
38330 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
38340 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
38350 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
38360 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
38370 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
38380 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
38390 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
383a0 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
383b0 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
383c0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
383d0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
383e0 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
383f0 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
38400 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
38410 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
38420 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
38430 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
38440 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
38450 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
38460 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
38470 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
38480 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
38490 52 59 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  RY);..#if SQLITE
384a0 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
384b0 54 45 43 54 49 4f 4e 0a 20 20 70 2d 3e 70 72 6f  TECTION.  p->pro
384c0 74 46 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20  tFlags = (flags 
384d0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  & SQLITE_OPEN_FI
384e0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
384f0 4b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a  K);.#endif.    .
38500 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
38510 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
38520 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
38530 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
38540 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
38550 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20  th */.    uid_t 
38560 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  uid;            
38570 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69          /* Useri
38580 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
38590 2f